一、长时间定时任务,比较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);

PendingInent,Intent 更加倾向于去立即执行某个动作,而 PendingIntent 更加倾向于在某个合适的时机去执行某个动作。所以,也可以把 PendingIntent 简单地理解为延迟执行的 Intent。

getActivity()方法、getBroadcast()方法、getService()方法

ALARM_ACTION_CODE,Intent传递给广播接收者的action,自己设定。

PendingIntent.FLAG_CANCEL_CURRENT,pendingIntent的第四个参数如果直接传0,表示你不打算通过任何一个flag来控制pendingIntent的创建。下面说说pendingIntent提供的四种flag:

FLAG_CANCEL_CURRENT,如果要创建的PendingIntent已经存在了,那么在创建新的PendingIntent之前,原先已经存在的PendingIntent中的intent将不能使用。

FLAG_NO_CREATE,如果要创建的PendingIntent尚未存在,则不创建新的PendingIntent,直接返回null。

FLAG_ONE_SHOT,相同的PendingIntent只能使用一次,且遇到相同的PendingIntent时不会去更新PendingIntent中封装的Intent的extra部分的内容。

FLAG_UPDATE_CURRENT,如果要创建的PendingIntent已经存在了,那么在保留原先PendingIntent的同时,将原先PendingIntent封装的Intent中的extra部分替换为现在新创建的PendingIntent的intent中extra的内容。

那么如何比较新老pendingIntent是否相同呢?

PendingIntent重写了equals方法,判定两个PendingIntent是否相同的依据是它封装的Intent是否“相同”和requestCode是否一致。

注意,“相同”上打了引号,这是因为在比较PendingIntent中封装的intent时是否相同时,使用的是Intent的filterEquals方法,该方法认为只要两个intent具有相同的action、data、categories、components、type和flags(这个flags是intent的flags)就认为它们两个是“相同”的,filterEquals是不会比较两个intent的extra部分和内存地址的。

另外需要注意的是,Intent并没有重写equals方法,所以如果使用Intent的equals方法比较两个intent对象的话,比较的是两个对象的内存地址。

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

第一个参数表示闹钟类型:一般为 AlarmManager.ELAPSED_REALTIME_WAKEUP或者 AlarmManager.RTC_WAKEUP。它们之间的区别就是前者是从手机开机后的时间,包含了手机睡眠时间;而后者使用的就是手机系统设置中的时间。所以如果设置为AlarmManager.RTC_WAKEUP ,那么可以通过修改手机系统的时间来提前触发定时事件。另外,对于相似的 AlarmManager.ELAPSED_REALTIME 和 AlarmManager.RTC 来说,它们不会唤醒 CPU 。所以使用的频率较少;

第二个参数表示任务首次执行时间:与第一个参数密切相关。第一个参数若为 AlarmManager.ELAPSED_REALTIME_WAKEUP ,那么当前时间就为 SystemClock.elapsedRealtime() ;若为 AlarmManager.RTC_WAKEUP ,那么当前时间就为 System.currentTimeMillis() ;

第三个参数表示两次执行的间隔时间:这个参数没什么好讲的,一般为常量;

第四个参数表示对应的响应动作:一般都是去发送广播,然后在广播接收 onReceive(Context context, Intent intent) 中做相关操作。

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

android alarmmanager后台,Android各版本AlarmManager使用相关推荐

  1. android alarmmanager后台,Android AlarmManager实现定时循环后台任务

    这篇文章使用AlarmManager实现了Android定时后台循环任务.使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息. AlarmManager简介 Alarm ...

  2. android nfc后台,android NFC开发简单入门

    前言: 说道NFC,是Near Field Communication缩写,就是近距离无线通讯技术.NFC采用主动和被动两种通信模式,工作的模式有三种,读写标签,点对点,仿真卡模式,今天我们只是简单的 ...

  3. android alarmmanager 收不到广播,android定时闹钟:Service+BroadcastReceiver+AlarmManager+NotificationManager...

    在开发android的过程中,需要一个定时提醒的功能,原本以为是一个很简单的功能,但是发现网上能找到的讲解或者代码都很或多或少地缺少一部分的设置和关键代码,所以我才注册了简书账户,分享一下. 在研究的 ...

  4. android定时循环,Android AlarmManager实现定时循环后台任务

    这篇文章使用AlarmManager实现了Android定时后台循环任务.使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息. AlarmManager简介 Alarm ...

  5. android alarmmanager进程,Android中使用AlarmManager需注意设置进程属性

    Android中使用AlarmManager需注意设置进程属性 在Android中,AlarmManager提供了不受休眠状态的系统定时功能,其一般使用方法如下. 1.创建一个BroadcastRec ...

  6. android alarmmanager 闹钟,Android编程使用AlarmManager设置闹钟的方法

    本文实例讲述了Android编程使用AlarmManager设置闹钟的方法.分享给大家供大家参考,具体如下: package com.Aina.Android; import android.cont ...

  7. android 设置每天重复通知,使用AlarmManager设置重复通知-Android

    我正在使用TimePicker从用户那里获取特定时间.然后,我每天都在这段时间使用此时间设置重复警报.当警报响起时,我希望将通知发送给用户.我的代码似乎是正确的,并且我在android studio中 ...

  8. 使用AlarmManager实现Android应用每天定时执行任务

    介绍 android官方文档:AlarmManager 在Android平台,除了使用AlarmManger外,还可以使用Timer或者Handler来实现定时任务,但这两种方式定时并不会太准确:因此 ...

  9. android 闹钟服务,android开发笔记之 AlarmManager(闹钟服务)

    手机闹钟服务AlarmManager AlarmManager通常用来开发手机闹钟,并且它是一个全局定时器,可在指定时间或指定周期启动其他组件(包括Activity,Service,Broadcast ...

最新文章

  1. Android自定义View基本步骤
  2. js this pointer 指针
  3. Django框架----分页器(paginator)
  4. 关于用notepad++确认代码中\r\n\t空格等不显示的字符
  5. C#下把txt文件数据读进sql server中存储所遇到的乱码问题
  6. Windows 10 关闭Hyper-V
  7. Java B2B2C多用户电子商务平台SpringCloud/Boot
  8. jq 检测元素内html变化,jq 监听 textarea 元素内容变化的方法
  9. python爬虫执行js代码_python爬虫执行js代码-execjs
  10. python chardet模块_使用Python chardet模块解决中文乱码问题
  11. matlab 辅助公差设计,尺寸公差辅助标注插件
  12. 成人python线上培训机构_哪些成年人正通过在线教育平台学习?看这个大数据报告就知道...
  13. 搭建springboot+mybatis+freemarker项目
  14. cot函数 java_java8、jdk8日期与字符串转化
  15. 使用T-SQL语句插入、更新、删除数据表
  16. arcgis中字段的融合_利用ArcGis进行地理处理之三(融合)
  17. 【海量数据学院】DBA的学习方法论系列—正确的学习方法
  18. 消防设施操作员考试真题、模拟练习题库(8)
  19. log4j/log4e的使用
  20. python修改Jenkins job的参数默认值

热门文章

  1. CC00006.CloudOpenStack——|OpenStack组件.V01|——|openstack-keystone|组件说明|
  2. 图论算法 有图有代码 万字总结 向前辈致敬
  3. linux poi只有一列,poi linux 报错
  4. 当当李国庆谈“刘强东案”:虽煞风景,但划得来
  5. 个人以及企业用户如何选择合适的阿里云服务器?
  6. sumo路由文件(.rou.xml文件)的生成以及关于生成交通流的一些方法
  7. C# treeview用法 加根节点与子节点
  8. 不明所以然,就被KO了,内部人员道出真相,原因竟在这!
  9. 全志H3编译Linux-4.14 BSP
  10. 我的小情绪、小失落、小想念