27
2017
09

AlarmManager延时任务不生效

今天在实现一个延时任务时用到了AlarmManager, 想用它实现5秒后打开一个activity的操作。大概代码如下:

        Intent intent = new Intent(this, Main2Activity.class);
        PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);

        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis() + 5*1000, pi);

运行后发现不生效,5秒后Main2Activity并未打开。于是查找原因,发现这儿有个值得注意的地方,就是AlarmManager的set()方法:
参数如下:

public void set(int type, long triggerAtMillis, PendingIntent operation)

其中:
第一个参数,type,有四个可选的值:
#ELAPSED_REALTIME 表示任务触发时间从系统开机时间起算,不会唤醒CPU
#ELAPSED_REALTIME_WAKEUP 表示任务触发时间从系统开机时间起算,会唤醒CPU
#RTC 表示任务触发时间从1970年1月1日0点起算,不会唤醒CPU
#RTC_WAKEUP 表示任务触发时间从1970年1月1日0点起算,会唤醒CPU

第二个参数,triggerAtMillis表示任务触发的时间,以毫秒为单位。

要注意的就在这里。上面的代码中,第一个参数是AlarmManager.ELAPSED_REALTIME_WAKEUP,表示任务触发时间从系统开机时间起算,但第二个参数却用的是System.currentTimeMillis() + 5*1000,表示准确触发时间是是自1970年1月1日0时起再加5秒,两个参数不对应,因此延时任务失效。

那么怎么改呢?
可以用下面两种改法:
1.

am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5*1000, pi);

2.

am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 5*1000, pi);

总之两个参数所表示的时间计算机制一样就可以了。

上一篇:Android studio 常用快捷键 下一篇:LimeSDR + Osmo-TRX + OpenBTS搭建简易GSM基站测试