【Android 电量优化】电量优化特性 ( Doze 低电耗模式 | Standby 应用待机模式 | 白名单设置 | 白名单添加系统设置界面 | 指定应用的白名单添加界面 | 测试应用 )
2023-09-14 09:07:31 时间
Android 6.0 之后 , 引入了电量优化相关特性 Doze 低电耗模式 和 Standby 应用待机模式 ;
上述两个特性都是通过 优化手机在未充电时的行为 , 达到延长手机待机时间的目的 ;
- Doze 低耗电模式 : 延迟后台应用的 CPU 和网络模块工作 , 之后集中执行相关工作 ;
- Standby 应用待机模式 : 延迟近期没有使用过的应用的网络活动 ;
一、Doze 低耗电模式简介
手机进入 Doze 低耗电模式条件 :
- 未接通电源
- 屏幕关闭
- 设备处于不活动状态 , 并且已经维持了一段时间
- 没有在白名单中
Doze 低耗电模式下 , 延迟 CPU 和网络使用 , 每隔一段时间有一段维护时间 , 在维护窗口时间内 , 集中执行被延迟的 CPU 和 网络操作 ; 维护期结束后 , 再次进入 Doze 低功耗模式 , 开始延迟 CPU 和网络操作 ;
退出 Doze 低耗电模式 :
- 充电
- 唤醒设备
下图是官网给出的 Doze 工作示意图 , 横轴代表时间 , 橙色部分表示 CPU 工作时间 , 绿色部分表示设备处于休眠状态 ; CPU 会在维护窗口期 , 集中执行一些任务 , 剩余的时间处于休眠状态 ;
低耗电模式限制的操作 :
- 访问网络
- 唤醒锁定
- AlarmManager 闹钟管理器操作
- WLAN 扫描
- 同步适配器
- JobScheduler
上述操作都会在 Doze 窗口期进行集中操作 ;
二、Standby 应用待机模式简介
Standby 应用待机模式简介 : 如果用户一段时间内没有使用某个应用 , 则判定该应用处于待机模式 ;
以下操作不能判定为应用待机模式 :
- 用户启动的应用
- 应用有前台进程运行
- 该应用有对应的通知处于可见状态
- 设备管理器应用
三、Doze 和 Standby 模式测试
Doze 低耗电模式测试 :
- 进入 Doze 模式 : 进入 Doze 模式后 , 测试应用的运行状况 , 是否能达到要求 ;
$ adb shell dumpsys deviceidle force-idle
- 退出 Doze 模式 : 退出 Doze 模式之后 , 测试应用运行状态 , 是否恢复正常 ;
$ adb shell dumpsys deviceidle unforce
- 重新激活设备 :
$ adb shell dumpsys battery reset
Standby 应用待机模式测试 :
- 使应用强行进入待机模式 : 进入 Standby 模式后 , 测试应用的运行状况 , 是否能达到要求 ;
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true
- 应用唤醒 : 退出 Standby 模式之后 , 测试应用运行状态 , 是否恢复正常 ;
$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>
四、白名单添加 ( 方式一 )
加入了白名单以后 , 就不再受该功能限制 , 自由使用以下功能 ;
白名单添加工具类 :
package kim.hsl.bp;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.PowerManager;
import android.provider.Settings;
/**
* 白名单
*/
public class WhiteListUtils {
public static final String TAG = "WhiteListUtils";
/**
* 引导用户添加白名单
* @param context
*/
public static void addWhiteList(Context context){
// 获取电量管理器
PowerManager powerManager = (PowerManager) context.
getSystemService(Context.POWER_SERVICE);
// Android 6.0 以上才能使用该功能
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 查看当前应用是否则电量白名单中
boolean isInWhiteList = powerManager.
isIgnoringBatteryOptimizations(context.getPackageName());
// 如果没有在白名单中 , 弹出对话框 , 引导用户设置白名单
if(!isInWhiteList){
// 弹出白名单设置对话框
Intent intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
context.startActivity(intent);
}
}
}
}
Activity 中调用 :
public class MainActivity extends AppCompatActivity {
public static final String TAG = "Battery_Performance.MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 引导用户打开白名单
WhiteListUtils.addWhiteList(this);
}
}
弹出白名单设置 : 需要自己从应用列表中选择 ;
设置不进行优化 :
五、白名单添加 ( 方式二 )
白名单添加工具类 :
package kim.hsl.bp;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.PowerManager;
import android.provider.Settings;
/**
* 白名单
*/
public class WhiteListUtils {
public static final String TAG = "WhiteListUtils";
/**
* 引导用户添加白名单
* @param context
*/
public static void addWhiteList2(Context context){
// 获取电量管理器
PowerManager powerManager = (PowerManager) context.
getSystemService(Context.POWER_SERVICE);
// Android 6.0 以上才能使用该功能
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 查看当前应用是否则电量白名单中
boolean isInWhiteList = powerManager.
isIgnoringBatteryOptimizations(context.getPackageName());
// 如果没有在白名单中 , 弹出对话框 , 引导用户设置白名单
if(!isInWhiteList){
// 弹出白名单设置对话框
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
// 带上要设置的包名
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
}
}
}
}
Activity 中调用 :
public class MainActivity extends AppCompatActivity {
public static final String TAG = "Battery_Performance.MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 引导用户打开白名单
WhiteListUtils.addWhiteList2(this);
}
}
弹出白名单设置 : 直接可以设置指定应用到白名单中 ;
相关文章
- android开机动画多长时间_Android开机动画原理分析
- android 浏览器 开发,Android 浏览器的开发实例分享
- strictmode android,Android 应用性能优化-StrictMode(严格模式)
- VMware实现Android x86 8.1 从安装到使用———全网最全,全网首发,本人实测
- #Android单元测试学习总结「建议收藏」
- GB/T28181-2016传输要求和Android平台设备接入技术实现
- android 模拟器 haxm,Android模拟器不使用HAXM
- android sdk根目录,Android SDK位置
- android 获取收到短信验证码,Android自动获取短信验证码
- robotium android,Robotium 测试Android apk安装包
- android取消toast_android重写toast
- android登录注册跳转的代码_Android开发代码
- android attrs获取_关于Android attrs 自定义属性的说明
- Android修改字体_android设置字体样式
- Android 稳定性测试实践
- 【技术分享】Android渗透测试
- 【Android 应用开发】Android 平台 HTTP网速测试 案例 API 分析
- 【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 )
- 【Android 逆向】ptrace 函数 ( C 标准库 ptrace 函数简介 | ptrace 函数真实作用 )
- 【Android Gradle 插件】build.gradle 中的 android 配置 ( 配置项 | compileSdkVersion 配置 | buildToolsVersion 配置 )
- Android开发中遇到的问题(三)——eclipse创建android项目无法正常预览布局文件详解手机开发
- [android] android下junit测试框架配置详解手机开发
- Android也能做Web开发了详解手机开发
- Android系统自带样式(android:theme)
- android图库播放幻灯片时按power键灭屏再亮屏显示keyguard
- Android中生成、使用Json数据实例
- Android实现创建或升级数据库时执行语句