【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )
参考 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() {
@Override
public void onReceive(Context context, Intent intent) {
// 获取广播事件
String action = intent.getAction();
if(TextUtils.equals("ACTION", action)){
Log.i(TAG, "receiver ACTION");
}
}
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
② 注册广播接收者 : 注册上述创建的广播接收者 , 注册接收 ACTION 广播 ;
IntentFilter intentFilter = new IntentFilter("ACTION");
registerReceiver( receiver, intentFilter);
- 1
- 2
③ 创建延迟意图 : 首先创建普通的 Intent 意图 , 然后设置 ACTION 事件 , 根据该 Intent 创建延迟意图 PendingIntent ;
mAlarmIntent = new Intent();
mAlarmIntent.setAction("ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mAlarmIntent, 0);
- 1
- 2
- 3
④ 闹钟管理器设置 : 获取闹钟管理器 AlarmManager , 并设置每隔 50 秒发送一次广播 , 广播接收者接收到该意图 , 就会处理对应事件 ;
// 获取闹钟管理器
mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
// 设置闹钟管理器每隔 50 秒发送一次延迟意图
mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime(), 50000, pendingIntent);
- 1
- 2
- 3
- 4
- 5
三、使用 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
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// 使用闹钟管理器保持 CPU 唤醒
alarmKeep();
}
@Override
public 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() {
@Override
public void onReceive(Context context, Intent intent) {
// 获取广播事件
String action = intent.getAction();
if(TextUtils.equals("ACTION", action)){
Log.i(TAG, "receiver ACTION");
}
}
};
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
2、AndroidManifest.xml 服务配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="kim.hsl.bp">
<application
android: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 服务 -->
<service
android:name=".AlarmManagerService"
android:process=":alrmmanager" />
</application>
</manifest>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
40:51
四、源码及资源下载
源码及资源下载地址 :
-
① GitHub 工程地址 : Battery_Performance
-
② 使用 AlarmManager 保持 CPU 唤醒 Service 代码地址 : AlarmManagerService.java
-
③ AndroidManifest.xml 配置文件地址 : AndroidManifest.xml
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/107165616
- 点赞
- 收藏
- 关注作者
评论(0)