整理自《第一行代码》

由于手机的休眠策略,Android会在长时间不操作的情况下自动让CPU进入到睡眠状态。

Alrarm具有唤醒CPU的功能,它可以保证在大多数情况下需要执行定时任务的时候CPU都能正常工作。

注意是唤醒CPU不是唤醒屏幕。

Alarm机制

主要用AlarmManager类实现,通过调用Context的getSystemService()方法来获取实例。

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

获取到实例后,调用AlarmManager的set()方法就可以设置一个定时任务。

manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime()+10*1000,pendingIntent);

set()方法有三个参数:

参数一:整型    AlarmManager的工作模式/类型。

有四种类型可选:

ELAPSED_REALTIME    表示让定时任务的触发时间从系统开机开始算起    不会唤醒CPU

ELAPSED_REALTIME_WAKEUP    同上    但是会唤醒CPU

RTC    表示让定时任务的出发时间从1970/1/1 00:00开始算起    不会唤醒CPU

REC_WAKEUP    同上    会唤醒CPU

PS:

使用SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数。

使用System.currentTimeMillis()方法可以获取到1970/1/1 00:00至今所经历时间的毫秒数。

参数二:长整型    任务触发的事件,单位是毫秒。

这个一看就懂,古不做记录

参数三:延迟意图    PendingIntent

调用    getService()/getBoradcast()    来获取一个能够被执行的PendingIntent。

当定时任务被触发时,服务在onStartCommand()方法/广播接收器的onReceive()方法    中执行。

示例:每过10秒自动启动一次的服务

public class LongRunningService extends Service {@Nullable
    @Override
    public IBinder onBind(Intent intent) {return null;}@Override
    public int onStartCommand(Intent intent, int flags, int startId) {new Thread(new Runnable() {@Override
            public void run() {
//                这里执行具体的逻辑操作
                Log.d("FUCK", "香香的感觉,可带劲啦!");}}).start();/*这里不能忘记start*/
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);int anHour = 10 * 1000;/*定时10秒*/
        long triggerAtTime = System.currentTimeMillis() + anHour;Intent intent1 = new Intent(this, LongRunningService.class);PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent1, 0);alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);return super.onStartCommand(intent, flags, startId);}
}

注意不要忘记注册服务

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

最后就是启动服务了

在主活动中:

public class MainActivity extends AppCompatActivity {@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent(this, LongRunningService.class);this.startService(intent);Log.d("FUCK", "服务启动");}
}

即可实现每10秒再启动一次。

Doze模式

Android6.0之后,Google加入了一个全新的Doze模式,从而可以极大幅度地延长电池的使用寿命。

如果设备未充电,并处于静止状态(7.0中删除了这一条件),且屏幕关闭了一段时间后,就能进入到Doze模式。

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

Doze模式的工作过程:

在Doze模式下会受到限制的功能:

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

PS:如果你要求Alarm任务即使在Doze模式下也必须正常执行,Android提供了解决方案:

调用AlarmManager的setAndAllowWhileIdle()或者setExactAndAllowWhileIdle()方法就能让定时任务即使在Doze模式下也能正常执行。

Alarm机制-学习记录相关推荐

  1. Attention机制学习记录(四)之Transformer

    前言 注意力(Attention)机制[2]由Bengio团队与2014年提出并在近年广泛的应用在深度学习中的各个领域,例如在计算机视觉方向用于捕捉图像上的感受野,或者NLP中用于定位关键token或 ...

  2. 【Python学习记录】Numpy广播机制(broadcast)

    ✨ 博客主页:小小马车夫的主页 ✨ 所属专栏:Python学习记录 文章目录 一.什么是Numpy广播机制 二.Numpy广播应用 三.Numpy广播规则 一.什么是Numpy广播机制 在Numpy. ...

  3. 关于ATIS以及基于注意力机制的递归神经网络模型 的学习记录

    关于ATIS以及基于注意力机制的递归神经网络模型 的学习记录 此为本人学习的类笔记,主要内容为借助Google翻译机译的论文WHAT IS LEFT TO BE UNDERSTOOD IN ATIS? ...

  4. ASP.NETCore学习记录(一)

    ASP.NETCore学习记录(一) asp.net core介绍  Startup.cs  ConfigureServices  Configure  0. ASP.NETCore 介绍 ASP.N ...

  5. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  6. Redis的学习记录

    Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...

  7. 浏览器缓存机制学习总结

    浏览器缓存机制学习总结 最近在做一个考试系统时,由于经常加载试卷或图片等等静态资源,抽空学习了一下缓存机制,在此记录 为什么要使用缓存 1.通过HTTP协议,在客户端和浏览器建立连接时需要消耗时间,而 ...

  8. 王爽 16 位汇编语言学习记录

    以下为汇编学习记录,内容全部出自王爽的16位<汇编语言>,如有错误,可直接去查看原书. 汇编语言   机器语言是机器指令集的集合,机器指令是一列二进制数字,计算机将其翻译成高低电平,从而使 ...

  9. Shiro学习记录(详细)

    文章目录 Shiro学习记录 shiro核心组件 Spring Boot 整合 Shiro Shiro 整合 Thymeleaf Shiro学习记录 什么是 Shiro 官网:http://shiro ...

最新文章

  1. 机器学习PAL基本概念
  2. C++中判断在字符串中是否存在空格 以及 如何输入带空格的字符串
  3. 字节还有打游戏、听音乐这种神仙工作?
  4. PHP基础知识------页面静态化
  5. tas5707php,TAS5707PHP
  6. 手把手教你如何创造睡后收入
  7. C++保留小数点后两位
  8. 《新编计算机科学概论》一2.5 计算机软件系统
  9. 计算机硬盘储存怎么增加,如何扩大存储空间?电脑扩大新添加的硬盘的方法
  10. (文献随笔)肿瘤浸润的活化B细胞抑制结直肠癌的肝转移(Cell Report, 2022年8月30日)
  11. 免签接口 个人二维码收款系统/微信支付支付宝支付二维码监听自动发货/个人免签系统/个人免签支付 微信.支付宝 个人支付监控
  12. LINUX下USB1.1设备学习小记(5)_uhci与设备(2)
  13. ASO优化:为什么要做APP竞品分析
  14. CSS基础(13)- 更多的选择器
  15. GO工具开发|基于网站API的子域名与IP反查工具(二)
  16. MP1584EN降压型转换器学习
  17. 【学习进度】截至2022.9.6,已学习的C++知识
  18. 赛迪智库:政务数据不愿共享的成因及对策
  19. Open3d(三)——网格数据操作
  20. RSocket协议初识-Java中使用(二)

热门文章

  1. 戴尔910服务器系统安装教程,图解戴尔dell工作站T3600/T5600/T7600/T7910安装windows 7系统...
  2. Gerrit添加Verified
  3. 职业科普丨PMP是什么呢?
  4. bootstrap-fileinput踩坑-选择文件类型
  5. 如何打造团队的认同感
  6. 【智能无线小车系列七】在树莓派上使用USB网卡
  7. Deepin Boot Maker 深度启动盘制作工具
  8. 苹果笔记本装windows10后,如何一键截屏并保存到onedrive中?
  9. 网站性能测试基本指标
  10. 论 AI即将完成贝多芬《第十交响曲》