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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AlarmManager 是 Android 系统中的一个重要类,用于在特定时间触发操作。要设置每日任务,你可以使用 AlarmManager 结合 PendingIntent 和 Calendar 类来实现。 下面是一个简单的示例代码,演示如何使用 AlarmManager 设置每日任务: ```java // 获取 AlarmManager 实例 AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); // 创建一个 PendingIntent,用于指定触发时要执行的操作 Intent intent = new Intent(this, YourBroadcastReceiver.class); // 替换为你自定义的 BroadcastReceiver 类 PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); // 获取当前时间,并设置每天任务触发的时间 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, hour); // 替换为你希望触发的小时 calendar.set(Calendar.MINUTE, minute); // 替换为你希望触发的分钟 // 设置每天重复触发的时间间隔(这里设置为 24 小时) long intervalMillis = 24 * 60 * 60 * 1000; // 设置重复触发的任务 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), intervalMillis, pendingIntent); ``` 在上面的代码中,首先获取 AlarmManager 实例。然后创建一个 PendingIntent,用于指定触发时要执行的操作(例如广播接收器)。接下来,获取当前时间,并使用 Calendar 类设置每天任务触发的时间。最后,使用 setRepeating() 方法设置重复触发的任务,指定触发时间、重复间隔和 PendingIntent。 请注意,以上示例中的 YourBroadcastReceiver 类需要你自己定义,用于接收触发任务时的广播,并执行相应操作。 希望以上内容能对你有所帮助!如果你有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值