android 每天定时提醒功能实现

时间:2022-08-31 21:09:15

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

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

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

android 每天定时提醒功能实现

两个核心的方法 :

 

Java代码  android 每天定时提醒功能实现
  1. private final IAlarmManager mService;  
Java代码  android 每天定时提醒功能实现
  1. public void set(int type, long triggerAtMillis, PendingIntent operation) {   
  2.      try {                                                                    
  3.          mService.set(type, triggerAtMillis, operation);                      
  4.      } catch (RemoteException ex) {                                           
  5.      }                                                                        
  6.  }                 

 

 

Java代码  android 每天定时提醒功能实现
  1. public void setRepeating(int type, long triggerAtMillis,                          
  2.         long intervalMillis, PendingIntent operation) {                           
  3.     try {                                                                         
  4.         mService.setRepeating(type, triggerAtMillis, intervalMillis, operation);  
  5.     } catch (RemoteException ex) {                                                
  6.     }                                                                             
  7. }                                                                                 


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

 

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

 

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

 

Java代码  android 每天定时提醒功能实现
  1. // 进行闹铃注册  
  2. Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);  
  3. PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this0, intent, 0);  
  4.   
  5. // 过10s 执行这个闹铃  
  6. Calendar calendar = Calendar.getInstance();  
  7. calendar.setTimeInMillis(System.currentTimeMillis());  
  8. calendar.add(Calendar.SECOND, 10);  
  9.   
  10. AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);  
  11. manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);  



 

 

看一下AlarmReceiver 的源码:

 

Java代码  android 每天定时提醒功能实现
  1. /** 
  2.  *  
  3.  * @ClassName: AlarmReceiver   
  4.  * @Description: 闹铃时间到了会进入这个广播,这个时候可以做一些该做的业务。 
  5.  * @author HuHood 
  6.  * @date 2013-11-25 下午4:44:30   
  7.  * 
  8.  */  
  9. public class AlarmReceiver extends BroadcastReceiver {  
  10.       
  11.     @Override  
  12.     public void onReceive(Context context, Intent intent) {  
  13.     Toast.makeText(context, "闹铃响了, 可以做点事情了~~", Toast.LENGTH_LONG).show();  
  14.     }  
  15.   
  16. }  

 

 

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

 

Html代码  android 每天定时提醒功能实现
  1. <receiver android:name="com.example.alarmmanagerdemo.AlarmReceiver" android:process=":remote">  


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

 

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

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

 

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

 

Java代码  android 每天定时提醒功能实现
  1. Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);  
  2. PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this0, intent, 0);  
  3.   
  4. long firstTime = SystemClock.elapsedRealtime(); // 开机之后到现在的运行时间(包括睡眠时间)  
  5. long systemTime = System.currentTimeMillis();  
  6.   
  7. Calendar calendar = Calendar.getInstance();  
  8. calendar.setTimeInMillis(System.currentTimeMillis());  
  9. // 这里时区需要设置一下,不然会有8个小时的时间差  
  10. calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));  
  11. calendar.set(Calendar.MINUTE, mMinute);  
  12. calendar.set(Calendar.HOUR_OF_DAY, mHour);  
  13. calendar.set(Calendar.SECOND, 0);  
  14. calendar.set(Calendar.MILLISECOND, 0);  
  15. // 选择的定时时间  
  16. long selectTime = calendar.getTimeInMillis();  
  17. // 如果当前时间大于设置的时间,那么就从第二天的设定时间开始  
  18. if(systemTime > selectTime) {  
  19. Toast.makeText(MainActivity.this,"设置的时间小于当前时间", Toast.LENGTH_SHORT).show();  
  20. calendar.add(Calendar.DAY_OF_MONTH, 1);  
  21. selectTime = calendar.getTimeInMillis();  
  22. }  
  23. // 计算现在时间到设定时间的时间差  
  24. long time = selectTime - systemTime;  
  25. firstTime += time;  
  26. // 进行闹铃注册  
  27. AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);  
  28. manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,  
  29.                 firstTime, DAY, sender);  
  30. Log.i(TAG,"time ==== " + time +", selectTime ===== "  
  31. + selectTime + ", systemTime ==== " + systemTime +", firstTime === " + firstTime);  
  32. 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最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。




以上摘自:http://hualang.iteye.com/blog/1304054


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


完整Demo下载:
http://download.csdn.net/detail/jakend/6612033