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

铂金蛋蛋 发布于 2014/01/09 23:30
阅读 24K+
收藏 8

技术人有1说1,云栖大会热门话题,技术人把酒言欢,马上预约看直播!>>>

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

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

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

        //获取AlarmManager系统服务
        AlarmManager manager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);

        //包装需要执行Service的Intent
        Intent intent = new Intent(context, cls);
        intent.setAction(action);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);

        //触发服务的起始时间,根据传来的时间启动
        //  long triggerAtTime = getNextAlarmTime(begintime);
        //@TODO 即时启动 测试用。
        long triggerAtTime = SystemClock.elapsedRealtime();

        /**
         * 测试手机用的是小米2S(非开发版,没ROOT)miui 中为了节省电量,将AlarmManager 中的repeat时间步长设为5分钟。
         */
        //使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service
        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的开发论坛上有帖子说,这样设计是为了节省电量。

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)。     

加载中
0
z
zhangfei_jiayou
天坑,他把android系统api给改了!
0
chong子
chong子
居然用小米机子做开发。。。。
0
luiguangshui
luiguangshui
那这个问题怎么破呢?
0
淡明
淡明
小米的机器会定时统一唤醒所有alarm,好像是5分钟一次,包括android4.4貌似也改成这样的机制了,为了省电。解法只能在快到时间前唤醒,在程序里面用wakeLock进行精确定时。
Thanks
Thanks
你指的是什么快到时间 这个问题怎么解决的 给个思路
0
追风的男人
http://blog.csdn.net/lcf687619/article/details/51527731参考下这个看看
返回顶部
顶部