【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )
文章目录
- 一、AlarmManager 简介
- 二、使用 AlarmManager 保持 CPU 唤醒流程 ( 省电操作 )
- 三、使用 WeakLock 保持 CPU 唤醒 代码示例
- 1、Service 代码示例
- 2、AndroidManifest.xml 服务配置
- 四、源码及资源下载
参考 Google 官方文档 :
- 优化电池续航时间
- 管理设备唤醒状态
- 使设备保持唤醒状态
- 设置重复闹铃时间
上一篇博客 【Android 电量优化】电量优化 ( 唤醒锁定 | 使用 WeakLock 保持服务唤醒 | 屏幕唤醒 ) 中 , 使用 WeakLock 保持 CPU 唤醒 , 全程 CPU 都处于工作状态 , 该操作耗电量非常大 ;
AlarmManager 可以一定程度上替代上述 WeakLock , 并且可以稳定每隔一段时间唤醒 CPU , 避免了 CPU 全程唤醒的情况 , 同时也降低了耗电量 ;
一、AlarmManager 简介
AlarmManager 简介 :
① 激活时间 : AlarmManager 可以脱离于应用生命周期限制 , 每隔一段时间 , 定期执行任务 ; 即使应用没有执行 , 或者手机处于休眠状态 , 也可以触发执行操作 ;
② 间隔设定 : 开发者可以设定触发任务执行的周期 , 该任务一般是通过发送延迟意图 PendingIntent 实现 ;
③ 广播接收者 : 一般使用 AlarmManager 定时发送 延迟意图 PendingIntent 给广播接收者 , 在广播接收者中启动服务 , 或者执行其它任务 ;
④ 降低资源消耗 : 如上述保持 CPU 唤醒 , 全程耗电 , 使用 AlarmManager 每隔一段时间 , 唤醒一次 , 执行任务 , 然后继续休眠 , 可以极大降低资源消耗 ;
二、使用 AlarmManager 保持 CPU 唤醒流程 ( 省电操作 )
使用 AlarmManager 保持 CPU 处于唤醒状态 , 比使用 WeakLock 更省电 ;
使用 AlarmManager 保持 CPU 唤醒流程 :
① 创建自定义广播接收者 : 这里为了简单 , 在 Service 中简单创建一个广播接收者 , 处理 ACTION 事件 ;
private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// 获取广播事件String action = intent.getAction();if(TextUtils.equals("ACTION", action)){Log.i(TAG, "receiver ACTION");}}};
② 注册广播接收者 : 注册上述创建的广播接收者 , 注册接收 ACTION 广播 ;
IntentFilter intentFilter = new IntentFilter("ACTION");
registerReceiver( receiver, intentFilter);
③ 创建延迟意图 : 首先创建普通的 Intent 意图 , 然后设置 ACTION 事件 , 根据该 Intent 创建延迟意图 PendingIntent ;
mAlarmIntent = new Intent();
mAlarmIntent.setAction("ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mAlarmIntent, 0);
④ 闹钟管理器设置 : 获取闹钟管理器 AlarmManager , 并设置每隔 50 秒发送一次广播 , 广播接收者接收到该意图 , 就会处理对应事件 ;
// 获取闹钟管理器
mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
// 设置闹钟管理器每隔 50 秒发送一次延迟意图
mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime(), 50000, pendingIntent);
三、使用 WeakLock 保持 CPU 唤醒 代码示例
1、Service 代码示例
package kim.hsl.bp;import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;import androidx.annotation.Nullable;public class AlarmManagerService extends Service {public static final String TAG = "AlarmManagerService";/*** 闹钟意图*/private Intent mAlarmIntent;/*** 闹钟管理器*/private AlarmManager mAlarmManager;@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();// 使用闹钟管理器保持 CPU 唤醒alarmKeep();}@Overridepublic void onDestroy() {super.onDestroy();}private void alarmKeep(){// 注册广播接受者IntentFilter intentFilter = new IntentFilter("ACTION");registerReceiver( receiver, intentFilter);// 创建延迟意图mAlarmIntent = new Intent();mAlarmIntent.setAction("ACTION");PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mAlarmIntent, 0);// 获取闹钟管理器, 并设置每隔 50 秒发送一次广播mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 50000, pendingIntent);}/*** 接收上面每隔 5 秒发送的广播*/private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// 获取广播事件String action = intent.getAction();if(TextUtils.equals("ACTION", action)){Log.i(TAG, "receiver ACTION");}}};}
2、AndroidManifest.xml 服务配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.bp"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><!-- AlarmManager 保持 CPU 唤醒的 Service 服务 --><serviceandroid:name=".AlarmManagerService"android:process=":alrmmanager" /></application></manifest>
40:51
四、源码及资源下载
源码及资源下载地址 :
① GitHub 工程地址 : Battery_Performance
② 使用 AlarmManager 保持 CPU 唤醒 Service 代码地址 : AlarmManagerService.java
③ AndroidManifest.xml 配置文件地址 : AndroidManifest.xml
【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )相关推荐
- android 6.0电池优化,Android 优化——电量优化
WakeLock Android 系统本身为了优化电量的使用,会在没有操作时进入休眠状态,来节省电量.当然,为了便于开发(很多应用不可避免的希望在灭屏后还能运行一些事儿,或是要保持屏幕一直亮着--比如 ...
- Android9.0 P 电源管理android各版本电量优化功能策略
针对电量优化android的改动 在最近几个android版本中已存在的电量优化功能基础上,Android 9 引入了一些新功能来持续改进设备电源管理,以确保将系统资源提供给最需要它们的应用. 近几个 ...
- android os跑电量咋关,android 优化耗电量
作为app开发者,或许很少有人会注意app对电量的损耗,但是用户对电量可是很敏感的,app做好电量损耗的优化会为自己的app加分不少. 如果是一个好的负责任的开发者,就应该限制app对电量的影响,当没 ...
- android系统电量优化,基于Android系统网络耗电量优化方法的.pdf
基于Android系统网络耗电量优化方法的 2012年第10期,第 45卷 通 信 技 术 Vol.45,No.10,2012 总第250期 Communications Technology No. ...
- iOS 开发之优化电量
????????关注后回复 "进群" ,拉你进程序员交流群???????? 在现如今的开发中, 电量消耗是一个应用运行效果的一个重要的衡量标准,尤其是直播,运动应用.设备中的每个硬 ...
- 转:Android应用开发性能优化完全分析
转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...
- Android应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- 关于android性能,内存优化 http://www.cnblogs.com/zyw-205520/archive/2013/02/17/2914190.html
随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要 求远远高于PC的桌面应用程序.以上理由,足以需要 ...
- Android应用程序性能优化
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
最新文章
- kali win10双系统_kali 双系统+实体机(win10+kali)
- Xamarin.iOS编译时无法连接苹果系统
- linux系统下搭建php环境之-Discuz论坛
- 算法基础:常用的查找算法知识笔记
- 车牌识别中的可识性、放弃率、精度与识别率辨析
- uniaccess安全助手卸载_“安装一分钟,卸载半小时”,盘点高速下载通道中的流氓操作...
- 香肠派对电脑版_6款好玩的吃鸡小游戏,和平精英、香肠派对、迷你攻势、、、...
- 在训练CNN时,loss稳定在log(类别数)
- Ubuntu环境下,反编译工具Apktool,Dex2jar,jd-gul,luyten安装使用
- phpstorm配置xdebug 3.0教程
- 苹果电脑计算机找不到打印机,在苹果电脑上连接打印机可以这样操作
- html在线表格样式模板,纯css实现的table表格样式,教程站常用
- [×××.launch]is neither a launch file in package [××] nor is [××] a launch file name解决办法
- oracle 毫秒时间换mysql_Mysql与Oracle常用时间格式的转换
- python中range和arange的区别_浅谈Python中range与Numpy中arange的比较
- OWASP TOP10 移动安全漏洞(安卓)2017
- UserAgent 解析, 在线api
- C#winform图书管理系统(课程设计)
- readbook:自己设计mvc框架,java类似struts2的实现
- 开源arduino可视化编辑器Ardublockly源码开发环境搭建