今天在实现一个延时任务时用到了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);
总之两个参数所表示的时间计算机制一样就可以了。