Android AlarmManager 定时会 “失效” 的问题

需求: 应用需要增加一个定时接收推送信息的时间段设定的功能,如定制9:00-22:00 接收推送信息。

获取推送信息的service已经编写完毕,定时这块,先想到使用AlarmManager服务,但是在设定重复任务的时候发现设定好了interval时间后,任务并没有按期望启动。

开发测试机:小米2S(非开发版,未ROOT)

01         //获取AlarmManager系统服务
02         AlarmManager manager = (AlarmManager) context
03                 .getSystemService(Context.ALARM_SERVICE);
04  
05         //包装需要执行Service的Intent
06         Intent intent = new Intent(context, cls);
07         intent.setAction(action);
08         PendingIntent pendingIntent = PendingIntent.getService(context, 0,
09                 intent, PendingIntent.FLAG_UPDATE_CURRENT);
10  
11         //触发服务的起始时间,根据传来的时间启动
12         //  long triggerAtTime = getNextAlarmTime(begintime);
13         //@TODO 即时启动 测试用。
14         long triggerAtTime = SystemClock.elapsedRealtime();
15  
16         /**
17          * 测试手机用的是小米2S(非开发版,没ROOT)miui 中为了节省电量,将AlarmManager 中的repeat时间步长设为5分钟。
18          */
19         //使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service
20         manager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime,11 60 *1000, pendingIntent);


在使用小米机器(2S)开发时候发现当使用AlarmManager.RTC 类型时,interval会按照预期的设定来执行,如interval=3分钟,那么就是每3分钟执行一次任务,但是如果使用RTC_WAKEUP则发现interval会取5的步长来执行,比如interval 是3分钟,那么实际是按5分钟来repeat的,7分钟则是10,以此类推。(在虚拟机里测试时,则没有这个限制,可以随意设定interval时间并且按时执行)
miui的开发论坛上有帖子说,这样设计是为了节省电量。

1 manager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime,interval, pendingIntent);


附上AlarmManager中的type

public   static   final   int  ELAPSED_REALTIME
// 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时 间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。     

public   static   final   int  ELAPSED_REALTIME_WAKEUP
//能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。     

public   static   final   int  RTC
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。     

public   static   final   int  RTC_WAKEUP
//能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。     

Public static   final   int  POWER_OFF_WAKEUP
//能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。
// 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时 间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。     

你可能感兴趣的:(android技术)