Android 每天定时提醒功能实现

android要实现定时的功能那肯定就要用到闹铃相关的技术,

那么android闹铃实现是基于 AlarmManager 这个类的,首先我们来看一下它的几个主要的方法。

打开AlarmManager的源码,如下图显示:

两个核心的方法 :

private final IAlarmManager mService;
public void set(int type, long triggerAtMillis, PendingIntent operation) {
     try {
         mService.set(type, triggerAtMillis, operation);
     } catch (RemoteException ex) {
     }
 }               

 public void setRepeating(int type, long triggerAtMillis,
         long intervalMillis, PendingIntent operation) {
     try {
         mService.setRepeating(type, triggerAtMillis, intervalMillis, operation);
     } catch (RemoteException ex) {
     }
 }                                                                               

第一个方法主要功能是注册一个比较简单的闹铃,第二个方法是注册一个重复的闹铃,这里重复的意思是指:设置5s, 那么每隔5s会执行一次 。

我们看到这里具体的实现都是基于IAlarmManager的,而IAlarmManager是一个aidl(Android Interface definition language),具体的就不详细介绍了,大家有兴趣的可以自己研究一下。

下面我来看下set(int type, long triggerAtMillis, PendingIntent operation)方法是如何调用的:

// 进行闹铃注册
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);

// 过10s 执行这个闹铃
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 10);

AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

看一下AlarmReceiver 的源码:

/**
 *
 * @ClassName: AlarmReceiver
 * @Description: 闹铃时间到了会进入这个广播,这个时候可以做一些该做的业务。
 * @author HuHood
 * @date 2013-11-25 下午4:44:30
 *
 */
public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "闹铃响了, 可以做点事情了~~", Toast.LENGTH_LONG).show();
    }

}

还有别忘了,AndroidManifest.xml中需要加入:

<receiver android:name="com.example.alarmmanagerdemo.AlarmReceiver" android:process=":remote">

运行之后,过10s 弹出 "闹铃响了,可以做点事情了~~", 说明成功了。

ok,这个结果肯定不是我们想要的,我们想要的功能是每天定时提醒的功能,那么需要基于

setRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)

这个方法来实现,代码如下:

Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);

long firstTime = SystemClock.elapsedRealtime();    // 开机之后到现在的运行时间(包括睡眠时间)
long systemTime = System.currentTimeMillis();

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
// 这里时区需要设置一下,不然会有8个小时的时间差
calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
calendar.set(Calendar.MINUTE, mMinute);
calendar.set(Calendar.HOUR_OF_DAY, mHour);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
// 选择的定时时间
long selectTime = calendar.getTimeInMillis();
// 如果当前时间大于设置的时间,那么就从第二天的设定时间开始
if(systemTime > selectTime) {
Toast.makeText(MainActivity.this,"设置的时间小于当前时间", Toast.LENGTH_SHORT).show();
calendar.add(Calendar.DAY_OF_MONTH, 1);
selectTime = calendar.getTimeInMillis();
}
// 计算现在时间到设定时间的时间差
long time = selectTime - systemTime;
firstTime += time;
// 进行闹铃注册
AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);
manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                firstTime, DAY, sender);
Log.i(TAG,"time ==== " + time +", selectTime ===== "
+ selectTime + ", systemTime ==== " + systemTime +", firstTime === " + firstTime);
Toast.makeText(MainActivity.this,"设置重复闹铃成功! ", Toast.LENGTH_LONG).show();

以上的思路大致是这样的,首先根据设置的时间,算出当前时间离设置时间的时间差,加上这个时间差,我们就知道第一次提醒的时间,然后再设定重复的时间间隔,我们这里设置1天就可以了。

现在解释一下setRepeating中第一个参数:

AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。
AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发躰时唤醒手机休眠;
RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。

还有,我们这里是调用广播的形式来实现的,也可以用service的方式来进行实现,只要把PendingIntent改动一下即可,相关代码:
PendingIntent.getService(MainActivity.this, 0,new Intent(MainActivity.this,AlarmService.class), 0);
其他的均相同。

点击这里:代码

时间: 2024-08-03 05:20:28

Android 每天定时提醒功能实现的相关文章

调用系统时间dialog(TimePicker),并设置定时提醒功能

/** * 顯示時間選擇dialog */ private void showTimePickerDialog() { Calendar calendar = Calendar.getInstance(); int hour=calendar.get(Calendar.HOUR_OF_DAY); int minute = calendar.get(Calendar.MINUTE); final TimePickerDialog timePickerDialog = new TimePickerD

小米开源便签Notes-源码研究(2)-定时提醒的便签

本篇讲述小米便签中的定时提醒功能.  便签,可以理解为一件事情,一项任务,有个定时提醒的功能,还是蛮不错的~    小米便签定时功能,是当编辑便签的时候,有个菜单项,选了之后,就弹出一个"日期对话框",选择了日期,就设置了定时功能. 下面讲解技术实现的整体思路(很多地方我也不懂,不懂的就搜索):    AndroidManifest.xml配置 <receiver android:name=".ui.AlarmInitReceiver" > <in

巧用Windows 7计划任务设置定时提醒

Windows 7系统有个“计划任务”功能,一般人都很少使用.其实,“计划任务”是系统自带的一个很实用的功能,比如说,这个功能可以设置定时提醒,这样在使用电脑时就不会因为太过投入而导致错过重要的事务.下面,小编就介绍一下这个“计划任务”功能的具体使用方法. 工具/原料 Windows 7计划任务 方法/步骤 1 单击开始菜单,在最下方的搜索框里搜索“计划任务”,再单击打开“任务计划程序”. 2 在“任务计划程序”窗口单击“创建基本任务”,打开“创建基本任务向导”.   输入任务的“名称”以及“描

用Python和NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台的两种发布方式)

Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html 平时经常用定时提醒来提高工作效率,到了Linux....蒙圈了,以前C#写的不能跨平台啊,于是就有了这篇文章~(有些人喜欢用番茄工作法,这个算是个福利了) 跳转到Python:https://www.cnblogs.com/dotnetcrazy/p/9111200.html#python 先NetCore吧:(old code:me) 核心代码:Proc

Android实现换肤功能(一)

上周有个朋友给建议说讲讲换肤吧,真巧这周公司的工作安排也有这个需求,换的地方之多之繁,让人伤神死了.正所谓磨刀不误砍柴工,先磨下刀,抽出一个工具类,写了个关于换肤的简单demo. Android中换肤的实现有几种方法,我使用的是读取共享进程空间另一apk中的资源的方法.大致的原理如下,让你的app和一个只有资源文件的app运行在同一进程中,这样你的app就可以访问另一app的资源了.原理很简单,下面我们分步骤讲解实现过程. 一.共享进程运行的空间 通过在两个工程下的manifest根节点添加相同

【转】为Android应用添加搜索功能

为Android应用添加搜索功能 为Android应用增加搜索功能:增加搜索建议

Java:利用java Timer类实现定时执行任务的功能

一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务,具体要执行的代码写在TimerTask需要被实现的run方法中. 二.先看一个最简单的例子 我们通过代码来说明 import java.text.SimpleDateFormat; import java.util.Date; import java.util.Ti

Ios开发中UILocalNotification实现本地通知实现提醒功能

这两天在做一个日程提醒功能,用到了本地通知的功能,记录相关知识如下: 1.本地通知的定义和使用: 本地通知是UILocalNotification的实例,主要有三类属性: scheduled time,时间周期,用来指定iOS系统发送通知的日期和时间: notification type,通知类型,包括警告信息.动作按钮的标题.应用图标上的badge(数字标记)和播放的声音: 自定义数据,本地通知可以包含一个dictionary类型的本地数据. 对本地通知的数量限制,iOS最多允许最近本地通知数

Eclipse Android 代码自动提示功能 (转)

Eclipse Android 代码自动提示功能 1.设置 java 文件的代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist > Auto activation triggers for Java ,设置框中默认是一个点, 现在将它改为: 以下为引用内容:  .abcdefghijklmnopqrstuvwxyz(,    2.设置 xml 文件的代码提示功能 打 开 Ecli