需求: 应用需要增加一个定时接收推送信息的时间段设定的功能,如定制9:00-22:00 接收推送信息。
获取推送信息的service已经编写完毕,定时这块,先想到使用AlarmManager服务,但是在设定重复任务的时候发现设定好了interval时间后,任务并没有按期望启动。
开发测试机:小米2S(非开发版,未ROOT)
02 | AlarmManager manager = (AlarmManager) context |
03 | .getSystemService(Context.ALARM_SERVICE); |
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); |
12 | // long triggerAtTime = getNextAlarmTime(begintime); |
14 | long triggerAtTime = SystemClock.elapsedRealtime(); |
17 | * 测试手机用的是小米2S(非开发版,没ROOT)miui 中为了节省电量,将AlarmManager 中的repeat时间步长设为5分钟。 |
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)。