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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值