Android AlarmManger 精准定时

本文详细介绍了如何在Android平台使用AlarmManager实现后台精准定时任务,包括一次性与重复任务设置、兼容性处理、设备重启后的任务执行,以及应对Doze和StandBy模式影响的方法。建议尽量减少对精确闹钟的使用,以延长设备电池寿命。
摘要由CSDN通过智能技术生成

业精于勤荒于嬉,写文章练习表达能力,写代码练习基本工。

Android 后台精准定时任务


引子

在Android平台上,要实现一个后台任务定时执行,并不是什么难事,方案有很多:

  1. 使用handler的sendMessageDelayed或sendMessageAtTime方法。
  2. 使用Timer + TimerTask。
  3. 使用AlarmManger。
  4. 使用WorkManager(周期性任务间隔大于15分钟以上)

不过,方式1,2都依赖于实现的线程生命周期,应用进程一旦停止,定时任务无法执行,而且如果CPU处在休眠状态,这两种方式是无法唤醒的,更不用说android在6.0之后为了延长电池寿命增加对后台任务的一系列限制措施,点击参考官网《针对低电耗模式和应用待机模式进行优化》,定时任务无法保证精准执行。

总之,如果你的后台任务,需要在进程退出后也能定时执行,并且具备唤醒CPU的能力,使用AlarmManger是不二选择

点击参考官网《后台处理指南》


方案

AlarmManger+Service+BroadcastReceiver


问题1:设置一次性精准定时任务的API兼容性

构造一个Intent,告诉闹铃何时启动。

		Calendar calendar_now = Calendar.getInstance();
        Calendar calendar_target = Calendar.getInstance();
        calendar_target.set(Calendar.HOUR_OF_DAY,hour);
        calendar_target.set(Calendar.MINUTE,minute);
        calendar_target.set(Calendar.SECOND,0);
        calendar_target.set(Calendar.MILLISECOND,0);
        //如果设置的时间已经过去了,推迟到第二天的这个时刻。
        if(calendar_target.before(calendar_now)){
   
            calendar_target.add(Calendar.DATE,1);
        }
        // 注册AlarmManager的定时服务
        Intent intent=new Intent(context, BackUpAlarmService.class);
        //获取闹钟服务
        AlarmManager am = (AlarmManager)context.getSystemService(ALARM_SERVICE);
        //8.0,必须启动前台服务,注意需要申请 android.permission.FOREGROUND_SERVICE权限
        PendingIntent pendingIntent;
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
   
            pendingIntent = PendingIntent.getForegroundService(context, REQUEST_CODE,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);
        }else{
   
            pendingIntent = PendingIntent.getService(context, REQUEST_CODE,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值