文章目录

  • 一、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 唤醒 )相关推荐

  1. android 6.0电池优化,Android 优化——电量优化

    WakeLock Android 系统本身为了优化电量的使用,会在没有操作时进入休眠状态,来节省电量.当然,为了便于开发(很多应用不可避免的希望在灭屏后还能运行一些事儿,或是要保持屏幕一直亮着--比如 ...

  2. Android9.0 P 电源管理android各版本电量优化功能策略

    针对电量优化android的改动 在最近几个android版本中已存在的电量优化功能基础上,Android 9 引入了一些新功能来持续改进设备电源管理,以确保将系统资源提供给最需要它们的应用. 近几个 ...

  3. android os跑电量咋关,android 优化耗电量

    作为app开发者,或许很少有人会注意app对电量的损耗,但是用户对电量可是很敏感的,app做好电量损耗的优化会为自己的app加分不少. 如果是一个好的负责任的开发者,就应该限制app对电量的影响,当没 ...

  4. android系统电量优化,基于Android系统网络耗电量优化方法的.pdf

    基于Android系统网络耗电量优化方法的 2012年第10期,第 45卷 通 信 技 术 Vol.45,No.10,2012 总第250期 Communications Technology No. ...

  5. iOS 开发之优化电量

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 在现如今的开发中, 电量消耗是一个应用运行效果的一个重要的衡量标准,尤其是直播,运动应用.设备中的每个硬 ...

  6. 转:Android应用开发性能优化完全分析

    转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...

  7. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  8. 关于android性能,内存优化 http://www.cnblogs.com/zyw-205520/archive/2013/02/17/2914190.html

     随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要  求远远高于PC的桌面应用程序.以上理由,足以需要 ...

  9. Android应用程序性能优化

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

最新文章

  1. kali win10双系统_kali 双系统+实体机(win10+kali)
  2. Xamarin.iOS编译时无法连接苹果系统
  3. linux系统下搭建php环境之-Discuz论坛
  4. 算法基础:常用的查找算法知识笔记
  5. 车牌识别中的可识性、放弃率、精度与识别率辨析
  6. uniaccess安全助手卸载_“安装一分钟,卸载半小时”,盘点高速下载通道中的流氓操作...
  7. 香肠派对电脑版_6款好玩的吃鸡小游戏,和平精英、香肠派对、迷你攻势、、、...
  8. 在训练CNN时,loss稳定在log(类别数)
  9. Ubuntu环境下,反编译工具Apktool,Dex2jar,jd-gul,luyten安装使用
  10. phpstorm配置xdebug 3.0教程
  11. 苹果电脑计算机找不到打印机,在苹果电脑上连接打印机可以这样操作
  12. html在线表格样式模板,纯css实现的table表格样式,教程站常用
  13. [×××.launch]is neither a launch file in package [××] nor is [××] a launch file name解决办法
  14. oracle 毫秒时间换mysql_Mysql与Oracle常用时间格式的转换
  15. python中range和arange的区别_浅谈Python中range与Numpy中arange的比较
  16. OWASP TOP10 移动安全漏洞(安卓)2017
  17. UserAgent 解析, 在线api
  18. C#winform图书管理系统(课程设计)
  19. readbook:自己设计mvc框架,java类似struts2的实现
  20. 开源arduino可视化编辑器Ardublockly源码开发环境搭建

热门文章

  1. C和C++中指针与地址的区别
  2. linux下ssh登录PIX防火墙
  3. 联想激发青年公益创业彰显“责任”意识
  4. ArcGIS API for Silverlight开发
  5. 洛谷 P1019 单词接龙 (DFS)
  6. keil c51的内部RAM(idata)动态内存管理程序(转)
  7. 红旗桌面版本最新应用方式和成绩解答100例-5
  8. 新年新气象,2008年是我创业关键的一年!
  9. [导入]ArcGIS破解克隆后出错问题解决
  10. BeanPostProcessor —— 连接Spring IOC和AOP的桥梁