app耗电优化之四 使用AlarmManager对任务进行合理安排
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);
}
}
}
这里只是说了一个大概,具体怎么使用,具体情况下在细说。
下面细说怎么和省电产生了关系。
- 通过AlarmManager安排的任务,在任务执行的时候,会带一个唤醒锁。直到任务结束。
- AlarmManager.RTC_WAKEUP 和AlarmManager.ELAPSED_REALTIME_WAKEUP 这两种类型会唤醒设备开始执行任务。这两种基本上不会省电。
- AlarmManager.ELAPSED_REALTIME 和 AlarmManager.RTC 这两种之后在设备被唤醒时才发Intent执行任务。这两种是可以省电的
- 对于循环执行的任务,最好还是设定为 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对任务进行合理安排的更多相关文章
- app耗电优化之二 使用电源管理来安排任务
PowerManager 电源管理(电源使用管理).主要管理设备启动,保持活动,休眠,唤醒.其中为了保持任务,提供了PowerManager.WakeLock(唤醒锁).执行任务时持有这个唤醒锁,就可 ...
- 包建强的培训课程(9):Android App性能优化
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Android APP 性能优化的一些思考
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- iOS性能优化篇 —— 耗电优化总结
手机App耗电的主要来源有以下四个因素: CPU处理,Processing 网络,Networking 定位,Location 图像,Graphics 耗电优化最终目的:通过尽可能降低CPU ...
- Android app 性能优化的思考--性能卡顿不好的原因在哪?
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- android app性能优化大汇总
这里根据网络上各位大神已经总结的知识内容做一个大汇总,作为记录,方便后续“温故知新”. 性能指标: (1)使用流畅度: 图片处理器每秒刷新的帧数(FPS),可用来指示页面是否平滑的渲染.高的帧率可以 ...
- Android APP性能优化(最新总结)
导语 安卓大军浩浩荡荡,发展已近十个年头,技术优化日异月新,如今Android 8.0 Oreo 都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得And ...
- fir.im Weekly - 如何进行 Android App 性能优化
关于 Android App 的优化,@anly-jun 用 3 个月完成了这一系列文章,从 性能分析工具 到 ANR .Layout .消除卡顿 到 内存优化.内存分析工具大概十五六篇,并对此做一个 ...
- 一触即发 App启动优化最佳实践
一触即发 App启动优化最佳实践 本文在 DiyCode 和 CSDN个人博客 同时首发,关注作者的 DiyCode帐号 或者 作者微博 可第一时间收到新文章推送. 文中的很多图都是Google性能优 ...
随机推荐
- axis调用webservice的简单方法
package com.service; import org.apache.axis.client.Call; import org.apache.axis.client.Service; publ ...
- Context源码分析
我们做安卓开发,时时都在和Context打交道,那么Context到底是什么?有什么作用?如何与Application,Activity,Service等实例发生联系的?等等 Context是什么? ...
- 快速上手 Kotlin 的 11 招
本文转载自 Kotlin 公众号(KotlinX) 作者:bennyhuo 最近经常会收到一些 "用 Kotlin 怎么写" 的问题,作为有经验的程序员,我们已经掌握了一门或者多门 ...
- Unity3d简单的socket通信
vs2010或其他创建C#工程 C#端代码一: using System; using System.Collections.Generic; using System.Linq; using Sys ...
- 前端开发规范:命名规范、html 规范、css 规范、js 规范
上周小组的培训内容是代码可读性艺术,主要分享如何命名.如何优化代码排版,如何写好的注释.我们都知道写出优雅的代码是成为大牛的必经之路. 下面感谢一位前端开发小伙伴总结的前端开发规范,通过学习相关开发规 ...
- HTML5 jQuery+FormData 异步上传文件,带进度条
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href ...
- 自动安装lnmp
注:需先上传各安装包至服务器.#!/bin/bash #! auto install lnmp #! 安装依赖环境 yum -y groupinstall "X Software Devel ...
- $.Deferred 延迟对象
一.什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们 ...
- 【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果
最近手头上的项目终于忙得差不多了,想起好久没有更新了的NanUI,再看着每天QQ群未读消息闪烁的标志,突然才发现似乎愧对了群里各位喜爱NanUI的朋友们.于是乎,就想趁这几天有时间,好好的修复一下Na ...
- html模板中的数字保留两位小数
<script> //html模板中的数字保留两位小数 function formatCurrency(num) { num = num.toString().replace(/\$|\, ...