使用Timer、Alarm和Jobschdule完成定时任务的比较

Timer

一般是用来做定时任务,它的定时是精确的定时,缺点是当Timer所在的进程被杀死以后任务也会停止。

Alarm

Alarm是通过系统来维护定时任务,可以在CPU进入休眠模式的时候唤醒CPU来完成定时任务,可以通过设置一段时间以后的定时任务还可以设置以后固定时间点的定时任务,但是最短时间间隔为1分钟,缺点是无法对特定的条件进行任务触发,比如当充电的时候采取做什么动作,同时对于国内的手机来说,应用被强杀以后Alarm也会失效

需要注意的是在Android4.4版本以前可以设置重复任务,使用setRepeating,但是在4.4以后重复任务不准确,谷歌可能为了限制使用AlarmManager在后台开启重复任务,新的api不再支持准确的重复任务,精确时间的任务都改为了一次性的任务,4.4版本以后使用setExact方法来进行一次性的精确任务,在6.0版本及其以后因为系统添加低耗电模式限制,添加setExactAndAllowWhileIdle方法可以在低耗电模式下开启闹铃,同时低耗电模式也不允许运行Jobschdule

看下面官网截图:
在这里插入图片描述

Jobschdule

Jobschdule也是系统维护的任务,它是通过设置一定的触发条件来执行任务,比如当手机充电的时候去执行什么任务,当手机连接wifi的时候才去执行什么任务,任务由系统去维护和调度,节省电量,不用程序自己去轮询条件的触发

三个类的具体使用就不再说了,网上随便找有很多。

最后

最后这里找到一段使用Alarm来完成重复精确任务的代码实现,就是使用广播来循环开启闹铃来达到重复的效果,弊端也是显而易见的,就是当程序退出广播会被回收,这样闹铃也就停止了

// pendingIntent 为发送广播
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), pendingIntent);
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), pendingIntent);
            } else {
            alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), TIME_INTERVAL, pendingIntent);
            }
        private BroadcastReceiver alarmReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // 重复定时任务
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TIME_INTERVAL, pendingIntent);
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TIME_INTERVAL, pendingIntent);
                }
                // to do something
                doSomething();
            }
            };

参考链接:关于使用 AlarmManager 的注意事项

猜你喜欢

转载自blog.csdn.net/static_zh/article/details/86242790