Android基础

Android各版本AlarmManager使用

2019-02-27  本文已影响2人  Candy有雪吃

一、长时间定时任务,比较Timer、Hnadler、AlarmManager

Timer,有一个明显的问题,它并不太适合用于需要长期在后台运行的定时任务。我们都知道,为了能让电池更加耐用,每种手机都会有自己的休眠策略,Android手机就会在长时间不操作的情况下自动让CPU进入睡眠状态,这就有可能导致Timer中的定时任务无法正常运行。

Hnadler,Handler的postDelay方法也可以实现定时操作,它同样也是不靠谱的,因为默认Hnadler依赖于线程(main线程或者子线程),所以只要进程被杀死,所有相关的线程都被晒死,所以handler中的定时操作就无效了。Timer也一样,因为Timer实际上是另起一个子线程,进程被杀,子线程当然也被杀了。

AlarmManager,它通过pendingIntent具有唤醒未启动进程的功能,即可以保证每次需要执行定时任务的时候CPU都能正常工作。但是当设备关机和重启后,闹钟将被清除。

二、使用AlarmManager

通过上面的分析,我们可以明显感受到AlarmManager在长时间定时任务中的优点,下面来说说它的用法(由于AlarmManager在不同的Android版本都有修改,所以如果想使用AlarmManager需要处理不同版本问题

1. 初始化PendingIntent

Intent intent = new Intent(ALARM_ACTION_CODE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
                REQUEST_CODE, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);

2. 初始化AlarmManager

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

3. 设置重复执行的定时任务

这个就要区分Android版本了

4.4之前,SDK API < 19

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime(), TIME_INTERVAL, pendingIntent);

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
                System.currentTimeMillis(), TIME_INTERVAL, pendingIntent);

4.4之后,6.0之前, SDK API >= 19, SDK API < 23

alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,                
                SystemClock.elapsedRealtime(), pendingIntent);

查阅 Android 官网中关于 Android 4.4 API 会看到如下几句话:

图片.png

6.0之后的版本,SDK API >= 23

alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,                
                SystemClock.elapsedRealtime(), pendingIntent);

再次打开 Android 官网中关于 Android 6.0 变更 ,发现在 Android 6.0 中引入了低电耗模式和应用待机模式。然后接着往下看 对低电耗模式和应用待机模式进行针对性优化 ,发现会有下面一段话:

图片.png
上一篇 下一篇

猜你喜欢

热点阅读