AlarmManager 是用来设定定时任务。即用来设定那个任务在什么时候开始执行。为什么和省电有关系?这个需要和AlarmManager的使用先说起。
AlarmManager 实际上只起到一个定时发送意图的工具。当它在特定的时间里面发送一个意图出去,还需要一个接收器去处理这个任务。具体的实例如下:

1  获取AlarmManager对象

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

2  设定广播

    final Intent intent = new Intent(Constants.ACTION_RETRY);
intent.setClass(this, DownloadReceiver.class);
/**
* 设置闹钟唤起时机和要发送的Intent
* 其中广播发送时机如下:
* AlarmManager.RTC_WAKEUP (硬件闹钟,System.currentTimeMillis())在指定的时间内发送Intent,并且会唤醒设备。
* AlarmManager.RTC (硬件闹钟,System.currentTimeMillis())在指定的时间内发送广播,如果设备没有被唤醒则不会发送Intent,直到设备被唤醒才会发送Intent。
* AlarmManager.ELAPSED_REALTIME_WAKEUP (真是时间SystemClock.elapsedRealtime())在指定的时间内发送广播,并唤醒设备。
* AlarmManager.ELAPSED_REALTIME (真是时间SystemClock.elapsedRealtime())在指定的时间内发送广播,如果设备没有被唤醒则不会发送Intent,直到设备被唤醒才会发送Intent。
* now + nextActionMillis 参数表示广播发送时间
* SDK API < 19
* */
mAlarmManager.set(AlarmManager.RTC_WAKEUP, now + nextActionMillis, PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_ONE_SHOT));
/**
* 设置一个重复闹钟
* 其中interval值如下
* INTERVAL_FIFTEEN_MINUTES
* INTERVAL_HALF_HOUR
* INTERVAL_HOUR
* INTERVAL_HALF_DAY
* INTERVAL_DAY
* SDK API < 19 高于19则不会被正常设定
*/
mAlarmManager.setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation);
/**
* 设置一个重复闹钟,但是这个方法会比较省电,系统会将若干闹钟合并为一个执行,来减少唤醒次数。
* SDK API < 19 高于19则不会被正常设定
*/
mAlarmManager.setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation);
/**
* SDK API >= 19 && SDK API < 23 在6.0上会在低电模式下无法使用。
*/
mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), pendingIntent);
/**
* SDK API >=23 解决低电下不能正常启动闹钟
*/
mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), pendingIntent);
/**
* 取消闹钟。
*/
mAlarmManager.cancel(PendingIntent operation);

各个Android版本的设定方式个不一样,有些可能会失效,所以要多注意。

3  广播接受定义接受器

<receiver android:name=".DownloadReceiver" android:exported="false">

4  实现接收器

public class DownloadReceiver extends BroadcastReceiver{
public void onReceive(final Context context, final Intent intent){
//带有唤醒锁,从任务开始直到任务结束。
if (Constants.ACTION_RETRY.equals(action)) {
startService(context);
}
}
}

这里只是说了一个大概,具体怎么使用,具体情况下在细说。

下面细说怎么和省电产生了关系。

  1. 通过AlarmManager安排的任务,在任务执行的时候,会带一个唤醒锁。直到任务结束。
  2. AlarmManager.RTC_WAKEUP 和AlarmManager.ELAPSED_REALTIME_WAKEUP 这两种类型会唤醒设备开始执行任务。这两种基本上不会省电。
  3. AlarmManager.ELAPSED_REALTIME 和 AlarmManager.RTC 这两种之后在设备被唤醒时才发Intent执行任务。这两种是可以省电的
  4. 对于循环执行的任务,最好还是设定为 AlarmManager.ELAPSED_REALTIME 和 AlarmManager.RTC

至于AlarmManager.ELAPSED_REALTIME 和 AlarmManager.RTC 这两种的区别在于SystemClock.elapsedRealtime() 和 System.currentTimeMillis() 时间。前者手机不会被修改,而且不会因为休眠而停止。后者则会被修改。

付AlarmManager好Timer的区别。 其中AlarmManager 是基于独立硬件钟(RTC)模块定时。该硬件可以在CPU休眠时正常运行,所以他可以唤醒CPU。而Timer则使用会在CPU休眠时定时失效。

其他耗电优化方法请看 app耗电优化

app耗电优化之四 使用AlarmManager对任务进行合理安排的更多相关文章

  1. app耗电优化之二 使用电源管理来安排任务

    PowerManager 电源管理(电源使用管理).主要管理设备启动,保持活动,休眠,唤醒.其中为了保持任务,提供了PowerManager.WakeLock(唤醒锁).执行任务时持有这个唤醒锁,就可 ...

  2. 包建强的培训课程(9):Android App性能优化

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  3. Android APP 性能优化的一些思考

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  4. iOS性能优化篇 —— 耗电优化总结

         手机App耗电的主要来源有以下四个因素: CPU处理,Processing 网络,Networking 定位,Location 图像,Graphics 耗电优化最终目的:通过尽可能降低CPU ...

  5. Android app 性能优化的思考--性能卡顿不好的原因在哪?

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  6. android app性能优化大汇总

    这里根据网络上各位大神已经总结的知识内容做一个大汇总,作为记录,方便后续“温故知新”. 性能指标: (1)使用流畅度:  图片处理器每秒刷新的帧数(FPS),可用来指示页面是否平滑的渲染.高的帧率可以 ...

  7. Android APP性能优化(最新总结)

    导语   安卓大军浩浩荡荡,发展已近十个年头,技术优化日异月新,如今Android 8.0 Oreo 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得And ...

  8. fir.im Weekly - 如何进行 Android App 性能优化

    关于 Android App 的优化,@anly-jun 用 3 个月完成了这一系列文章,从 性能分析工具 到 ANR .Layout .消除卡顿 到 内存优化.内存分析工具大概十五六篇,并对此做一个 ...

  9. 一触即发 App启动优化最佳实践

    一触即发 App启动优化最佳实践 本文在 DiyCode 和 CSDN个人博客 同时首发,关注作者的 DiyCode帐号 或者 作者微博 可第一时间收到新文章推送. 文中的很多图都是Google性能优 ...

随机推荐

  1. sqlmap详细使用 [精简]

    1. 基础用法: 一下./sqlmap.py 在kali和backtrack中使用sqlmap的时候,直接用:sqlmap ./sqlmap.py -u “注入地址” -v 1 –dbs   // 列 ...

  2. Mybatis配置(一)

    1.导入Mybatis包 2.得到SqlSession来访问数据库 /** * 访问数据库 */public class DBAccess {          public SqlSession g ...

  3. CSS3学习系列之选择器(四)

    使用选择器来插入文字 css2中,使用before选择器在元素前面插入内容,使用after选择器在元素后面插入内容,在选择器的content属性中定义要插入的内容.将content属性值设定为none ...

  4. Easyui设置动态表格,动态导出数据实例,附Dome

    最近碰到一个需求,需要提供一个弹出页面选择列表页面需要显示的列,页面确认之后需要修改列表页面显示的表格,导出的数据也需要同步变化. 下面直接上代码 1.设置需要显示的列columus为全局对象,用于子 ...

  5. 使用jQuery筛选排除元素以修改指定标签的属性

    简单案例: $(function(){ $("td[id][id!='']").click(function(){ //你的逻辑 }); }); 上述代码,有id且id不为空的td ...

  6. Redis客户端管理工具的安装及使用

    1.下载及安装 请到官网下载:www.treesoft.cn,要最新的版本treeNMS, window系统下载直接解压,就可以用了,免安装,免布署. 2.登录及连接参数配置 登录后,要配置连接参数信 ...

  7. Swift App项目总结

    最近公司新开了一个项目,由于我的同事的离职,所以就剩我自己了.于是就果断的使用纯纯Swift写了,之前也用过Swift,不过很早了,那时候Swift还不稳定,每次一升级Xcode,Swift升级以后语 ...

  8. 跨域访问之JSONP

    跨域 在平常的工作中常常会遇到A站点的需要访问B站点的资源. 这时就产生了跨域访问. 跨域是指从一个域名的网页去请求另一个域名的资源.浏览器遵循同源策略,不允许A站点的Javascript 读取B站点 ...

  9. React.js 小书介绍

    React.js 小书 Github 关于作者 这是一本关于 React.js 的小书. 因为工作中一直在使用 React.js,也一直以来想总结一下自己关于 React.js 的一些知识.经验.于是 ...

  10. 进入MVC处理通道

    这一篇主要讲如何通过Asp.net处理管道把请求交给MVC进行处理的(进入MVC处理通道). 首先来看一下经典的Asp.net处理管道的生命周期. 我们知道一个ASP.NET应用程序可以有多个Http ...