android 8.0定时提醒,20Android定时任务采用AlarmManager来实现,兼容8.0系统

https://blog.csdn.net/xu912996973/article/details/86700566

需要特别注意的是:

启动服务不在是startService() 而是startForegroundService()

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){

pendingIntent = PendingIntent.getForegroundService(context, requestCode,

intent, PendingIntent.FLAG_UPDATE_CURRENT);

}else{

pendingIntent = PendingIntent.getService(context, requestCode,

intent, PendingIntent.FLAG_UPDATE_CURRENT);

}

这是由于在8.0及之后,系统对后台服务运行做了限制,如果一个后台服务没有设置前台通知startForeground,那么系统将在5s内杀死服务,并且报出ANR。这么做是为了防止应用在后台偷偷的干着不可告人的事,后台服务一多不仅卡顿还增加了功耗,消耗了流量。如果要在后台做事,google官方推荐使用jobSchedule,这个jobService实际上也是继承自Service,只对Service进行了包装,当然包装之后jobScheduler的任务都交由JobSchedulerService系统服务去调度。

jobScheduler的优点

1.把任务整合起来,等到充电状态或者 Wifi 连接情况下进行执行,充电时候就不会在乎耗电量, Wifi 连接情况下比蜂窝网络省电。

2.在系统待机的时候,把任务整合到一起,一定时间批量处理,可以避免多次的唤醒 CPU,使 CPU 得不到休息,造成耗电

综合上面的定时方案的优缺点,及项目实际情况最终考虑采用AlarmManger来实现定时任务。

有不对的地方还望指出,欢迎拍砖

App定时提醒(AlarmManager实现,适配不同版本)

原创Typist夫少最后发布于2019-05-30 11:53:55                    阅读数 690收藏

本文主要介绍App定时提醒的实现方式及原理。篇幅较长,先提供demo地址。

方案一:利用Handler实现。Handler可以使用 sendEmptyMessageDelayed 来实现定时发送消息(提醒)的功能,但 sendEmptyMessageDelayed 方法是依赖于 Handler 所在的线程的,如果线程结束,就起不到定时任务的效果,故不适用

方案二:利用Timer实现。使用 Timer 可以精确地做到定时操作,但如果手机关屏后长时间不使用, CPU 就会进入休眠模式。这个使用如果使用  Timer 来执行定时任务就会失败,因为 Timer 无法唤醒 CPU。

方案三:利用AlarmManager实现。AlarmManager 依赖的是 Android 系统的服务,具备唤醒机制。

AlarmManager是Android的全局定时器。就是在指定时间做一个事情(封装在PendingIntent)。通过PendingIntent的getActivity()、getService()或getBroadcast()来执行。听起来AlarmManager和Timer很类似,但是Timer有可能因为手机休眠而被杀掉服务,但是AlarmManager可以做到唤醒手机。

AlarmManager提供了对系统定时服务的访问接口,使得开发者可以安排在未来的某个时间运行应用。当到达闹铃设定时间,系统就会广播闹铃之前注册的Intent。如果此时目标应用没有被启动,系统还会帮你自动启动目标应用。**即使设备已经进入睡眠已注册的闹铃也会被保持,只有当设备关闭或是重启的时候会被清除。**下面基于Android

8.0源码来一起学习一下。

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);

1

注:ALARM_SERVICE是Context的一个常量。

AlarmManager中一共提供了四种闹钟类型,前两种对应的System.currentTimeMillis()(系统当前时间)时间,后两种对应SystemClock.elapsedRealtime()(系统运行时间)时间,以WAKEUP结尾的类型能够唤醒设备,其他的类型不能唤醒设备,直到设备被唤醒才能出发警报提醒。

public static final int RTC_WAKEUP = 0;// 表示闹钟在睡眠状态下唤醒系统并执行提示功能,绝对时间。

public static final int RTC = 1;// 睡眠状态下不可用,绝对时间。

public static final int ELAPSED_REALTIME_WAKEUP = 2;// 睡眠状态下可用,相对时间。

public static final int ELAPSED_REALTIME = 3;// 睡眠状态下不可用,相对时间。

注1:以上绝对时间就是手机的时间,相对时间是相对于当前开机时间来说(包含了手机睡眠时间)。例如如果是绝对时间,那么你测试可以通过修改系统时间来提前触发。而相对时间的使用场景是强调多久之后触发,例如2小时后,这个时候把时间修改到2小时后也是没用的。

注2:不同闹钟类型对应的任务首次时间的获取方法:若为ELAPSED_REALTIME_WAKEUP,那么当前时间就为SystemClock.elapsedRealtime();若为RTC_WAKEUP,那么当前时间就为System.currentTimeMillis()。

注3:以前还有一个POWER_OFF_WAKEUP,即使在关机后还能提醒,但是Android4.0以后就没有了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值