Android的定时任务有两种,一种是JavaAPI提供的Timer类,另一种就是使用Android的Alarm机制。

Timer不太适合那些需要长期在后台运行的定时任务,因为每个手机都有自己的休眠策略,Android手机长时间不操作就会导致Timer定时任务无法执行,而Alarm具有唤醒CPU的功能,能保证大多数情况下,执行定时任务的时候CPU能正常工作。

 AlarmManager manager= (AlarmManager) getSystemService(Context.ACTIVITY_SERVICE);PendingIntent pendingIntent;/***    SystemClock.elapsedRealtime():获取到系统开机至今所经历的毫秒数*    System.currentTimeMillis():1970-1-1 0:00至今所经历的毫秒数**     ELAPSED_REALTIME:定时任务触发从系统开机算起 但不唤醒CPU*     ELAPSED_REALTIME_WAKEUP:定时任务触发从系统开机算起 唤醒CPU*     RTC:从1970-1-1 0:00算起 不唤醒CPU*     RTC_WAKEUP:从1970-1-1 0:00算起 唤醒CPU*//**pendIntent:一般会调用getSrervice或getBroadCast来获取一个能够执行服务或广播的pendingIntent,这样才能保证在任务被触发的时候,服务里的onStartCommand()和onRecive()方法被执行   */long time= SystemClock.elapsedRealtime()+10*1000;//10秒钟后执行任务manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,time,pendingIntent);

那么要实现一个长时间在后台定时运行的服务该怎么做?

创建一个MyService类

package com.example.test;import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;import androidx.annotation.Nullable;public class MyService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {new Thread(new Runnable() {@Overridepublic void run() {//TODO}}).start();AlarmManager manager= (AlarmManager) getSystemService(ALARM_SERVICE);int time=60*60*1000;//一小时long triggerAtTime= SystemClock.elapsedRealtime()+time;Intent intent1=new Intent(this,MyService.class);PendingIntent pendingIntent=PendingIntent.getService(this,0,intent1,0);manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pendingIntent);return super.onStartCommand(intent, flags, startId);}
}

可以看到先创建了一个子线程在这里执行具体的操作任务,然后就是alarm机制,定义任务触发一小时后,再使用PendingIntent指定定时处理任务的MyService,最后调用set方法设定完成。

这样就将一个长时间在后台定时运行的服务设定成功了,一旦启动了MyService,就会在onStartCommand()方法里设定一个定时任务,这样一小时后将会再次启动MyService,每隔一小时就会执行一次。

然后去使用,在manifest文件中注册服务

<service android:name=".MyService"/>

在使用的地方调用下面代码就可以。

Intent intent=new Intent(context,MyService.class);context.startService(intent);

但是在Android4.4后,定时任务变得不准确,会延时一段时间才能执行,那是因为系统在耗电方面进行的优化,系统会检测有多少Alarm任务存在,将触发时间相近的几个任务放在一起执行,这样可以大幅度的减少CPU被唤醒的次数,演唱电池的使用时长。也可以使用setExact()来代替set()方法,可以保证任务能够准时执行。

Doze模式:

如果设备未充电,并处于静止状态,且屏幕关闭了一段时间后,就能进入到Doze模式。

在Doze模式下,系统会对CPU、网络、Alarm等活动进行限制,从而延长电池的使用寿命。当然,系统并不会一直处于Doze模式,而是会间歇性地退出Doze模式一小段时间,在这段时间中,应用就可以去完成它的同步操作、Alarm任务等。

Doze模式下受限制的功能:

  • 网络访问被禁止。
  • 系统忽略唤醒CPU或者屏幕操作。
  • 系统不再执行WIFI扫描。
  • 系统不再执行同步服务。
  • Alarm任务将会在下次退出Doze模式的时候执行。

在Doze模式下, Alarm任务会变得相当不准,当然这种情况下对Alarm的要求也并不高,如果有特殊的要求,调用AlarmManager的setAndAllowWhileIdle()或者setExactAndAllowWhileIdle()方法就能让定时任务正常执行,和set()与setExact()的区别是一样的。

Android---Alarm定时任务 Doze模式相关推荐

  1. Android中的Doze模式

    概述 Android 6.0引入的Doze机制在于节省系统耗电量,保护电池,延长电池的使用时间.当设备未连接至电源,且长时间处于闲置状态时,系统会将应用进入Doze,置于App Standby模式.而 ...

  2. Android Alarm定时任务基础

    本文参考自<第一行代码> Android中定时任务有两种实现方式: 1.用 Java API 中的 Timer 类: 2.用 Android 的 Alarm 机制: 因为Android手机 ...

  3. Android O 的Doze模式白名单路径

    Doze 模式列表 上述备注规则如下 if(powerWhitelist.isSysWhitelisted(pkg)) {// Summary of app which doesn't have a ...

  4. Android Doze模式

    概论 从android6.0开始,android引入了两种省电技术以延长电池的使用寿命,分别是低电耗模式(Doze)和应用待机模式(App standby)模式.当设备屏幕关闭,不充电,Doze模式会 ...

  5. Android 8.0学习(16)---8.0 的Doze模式白名单路径

    Android O 的Doze模式白名单路径 Doze 模式列表 上述备注规则如下 if(powerWhitelist.isSysWhitelisted(pkg)) {// Summary of ap ...

  6. android创建定时任务

    时代会为你做出选择,不管你是否愿意. 最近的移动端的工作似乎也是到了瓶颈,工作并没有像15-16年那么火爆,貌似市场上出现供过于求的状态,但是没有必要感觉不安,你有着逻辑基础,有着基础能力,闭关几月在 ...

  7. Android 7.0 Doze模式分析

    白名单机制 Android6.0及更高版本还提供了Doze模式白名单列表,通过设置应用程序进入白名单 列表可逃脱Doze模式的各种限制.检测应用程序是否存在白名单list里面,可使用 PowerMan ...

  8. Android Doze模式源码分析

    科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...

  9. 【Android 低电耗/Doze原理---设备运动状态和位置对Doze模式的影响】

    Android 低电耗/Doze原理---设备运动状态和位置对Doze模式的影响 基础知识 Deep Idle的状态机 STATE_IDLE_PENDING----监听运动状态变化 STATE_SEN ...

最新文章

  1. 【机器学习基础】优化算法详解
  2. C4C的Rich text editor的JavaScript实现
  3. iOS 设置系统音量和监听系统音量变化
  4. Puma单栏博客Typecho主题
  5. 查看python进程_[原创] 如何查看一个Python进程在”干什么”: py-spy 来帮忙 – 编码无悔 / Intent Focused...
  6. Gradle学习总结——抓重点学Gradle
  7. WebAPI——自动生成帮助文档
  8. 俄罗斯议会预计2021年代币发行将激增
  9. 安卓android中国象棋chess程序项目源码源代码,C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!,c语言笔记大全...
  10. KITTI 3D目标检测数据集解析(完整版)
  11. 主成分分析(PCA)详解
  12. 【python爬虫专项(27)】拉勾网数据采集(关键词网址不发生变化)
  13. Flutter网格控件GridView
  14. ifconfig/docker删除虚拟网卡
  15. 史上最简单的spark教程第二章-快速开发部署你的第一个Java+spark程序
  16. K210频谱显示桌面摆件(Sipeed Maix Dock)
  17. VMware vRealize Automation 8.6 下载 - 现代基础架构自动化
  18. Flex在线文档阅读器::pdf、doc、docx、xls、xlsx、ppt、pptx、htm、txt、rtf、epub、csv、xdoc等
  19. 工具推荐 10款移动界面原型设计工具
  20. 酷狗音乐关键字搜索并生成下载url

热门文章

  1. PHP基础-字符串长度函数
  2. Odoo14的退货管理模块
  3. Android Activity的title的设置
  4. html点击跳转当前页面刷新,a标签组织页面跳转,并且刷新当前页面
  5. Linux:sshpass和scp的使用
  6. 视频教程-Unity客户端框架设计PureMVC篇视频课程(上)-Unity3D
  7. 微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)
  8. 点击图片查看原图(图片按比例展示,点击旋转)
  9. html图片排列布局下面字_css实现朋友圈照片排列布局代码实例
  10. pythonpath windows_如何添加在Windows 7中的PYTHONPATH