AlarmManager针对低电耗模式和应用待机模式进行优化
从 Android 6.0(API 级别 23)开始,Android 引入了两项省电功能,通过管理应用在设备未连接至电源时的行为方式,帮助用户延长电池寿命。当用户长时间未使用设备时,低电耗模式会延迟应用的后台 CPU 和网络活动,从而降低耗电量。应用待机模式会延迟用户近期未与之交互的应用的后台网络活动。
在低电耗模式下,标准 AlarmManager 闹钟(包括 setExact() 和 setWindow())推迟到下一个维护期。
如果您需要设置在设备处于低电耗模式时触发的闹钟,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
使用 setAlarmClock() 设置的闹钟将继续正常触发,系统会在这些闹钟触发之前不久退出低电耗模式。
这里我们来对比下setExact() 、 setWindow()、setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()
下面是Google官方对这几个接口的解释,参考https://developer.android.com/reference/android/app/AlarmManager
setExact安排在规定的时间准确发送警报。
该方法类似于 set(int, long, android.app.PendingIntent),但不允许操作系统调整传递时间。警报将尽可能接近请求的触发时间。
注意:只有对准确时间交付有强烈需求的警报(例如在请求的时间响起的闹钟)才应该被安排为准确的。强烈建议应用程序不要使用不必要的精确警报,因为它们会降低操作系统最大限度地减少电池使用的能力。
setWindow安排在给定的时间窗口内发送警报。此方法类似于 set(int, long, android.app.PendingIntent),但允许应用程序精确控制操作系统可能对其传递进行调整的程度。这种方法允许应用程序利用由交付批处理产生的电池优化,即使它对其警报有适度的及时性要求。
注意:从 API Build.VERSION_CODES#S 开始,应用程序不应在少于 10 分钟的窗口内通过。如果警报应该在不久的将来触发,系统将尽最大努力适应较小的窗口,但不能保证,应用程序应该期望任何小于 10 分钟的窗口被拉长到 10 分钟。
该方法还可用于通过确保为每个警报请求的窗口不相交来实现多个警报之间的严格排序保证。
当不需要精确传递时,应用程序应该使用标准的 set(int, long, android.app.PendingIntent) 方法。这将为操作系统提供最大的灵活性,以最大限度地减少唤醒和电池使用。对于必须在精确指定的时间发送且没有可接受的变化的警报,应用程序可以使用 setExact(int, long, android.app.PendingIntent)。
setAndAllowWhileIdle与 set(int, long, android.app.PendingIntent) 类似,但即使系统处于低功耗空闲(又名打瞌睡)模式,也允许执行此警报。这种类型的警报只能用于实际上需要在空闲时警报响起的情况——一个合理的例子是日历通知应该发出声音以便用户意识到它。当警报发出时,该应用程序还将被添加到系统的临时电源豁免列表中大约 10 秒,以允许该应用程序获取更多唤醒锁以完成其工作。
这些警报在空闲时会显着影响设备的电源使用(从而导致应用程序对其进行调度),因此应谨慎使用它们。为了减少滥用,对特定应用程序的这些警报的触发频率有限制。在正常的系统操作下,它不会超过大约每分钟发送这些警报(此时会发送每个此类未决警报);当处于低功耗空闲模式时,此持续时间可能会明显更长,例如 15 分钟。
与其他警报不同,系统可以自由地重新安排此类警报,使其与任何其他警报(甚至来自同一应用程序的警报)无序发生。这显然会在设备空闲时发生(因为此警报可能会在空闲时响起,当应用程序的任何其他警报将被保留到稍后时),但即使在不空闲时也可能发生。
无论应用程序的目标 SDK 版本如何,此调用始终允许批量处理警报。
setExactAndAllowWhileIdle与 setExact(int, long, android.app.PendingIntent) 类似,但即使系统处于低功耗空闲模式,也允许执行此警报。如果您不需要精确的闹钟调度但仍需要在空闲时执行,请考虑使用 setAndAllowWhileIdle(int, long, PendingIntent)。这种类型的警报只能用于实际上需要在空闲时警报响起的情况——一个合理的例子是日历通知应该发出声音以便用户意识到它。当警报发出时,该应用程序还将被添加到系统的临时电源豁免列表中大约 10 秒,以允许该应用程序获取更多唤醒锁以完成其工作。
这些警报在空闲时会显着影响设备的电源使用(从而导致应用程序对其进行调度),因此应谨慎使用它们。为了减少滥用,对特定应用程序的这些警报的触发频率有限制。在正常的系统操作下,它不会超过大约每分钟发送这些警报(此时会发送每个此类未决警报);当处于低功耗空闲模式时,此持续时间可能会明显更长,例如 15 分钟。
与其他警报不同,系统可以自由地重新安排此类警报,使其与任何其他警报(甚至来自同一应用程序的警报)无序发生。这显然会在设备空闲时发生(因为此警报可能会在空闲时响起,当应用程序的任何其他警报将被保留到稍后时),但即使在不空闲时也可能发生。请注意,与常规的精确警报相比,操作系统将允许自己更灵活地安排这些警报,因为应用程序已选择采用此行为。当设备空闲时,它可能需要更多的调度自由,以优化电池寿命。
总结下差异:setExact和setWindow不支持低功耗空闲(又名打瞌睡)模式;
setAndAllowWhileIdle和setExactAndAllowWhileIdle支持低功耗空闲(又名打瞌睡)模式;
相对于setWindow和setAndAllowWhileIdle,setExact和setExactAndAllowWhileIdle是精确的闹钟调度。
如下分别写了4个闹钟
package com.kxf.alarmmanagertestimport android.app.AlarmManager
import android.app.PendingIntent
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.SystemClock
import android.util.Logclass MyAlarmManager(val context: Context) {var alarmManager: AlarmManagerval requestCodeAlarmManagerExact = 101val requestCodeAlarmManagerWindow = 102val requestCodeAlarmManagerAndAllowWhileIdle = 103val requestCodeAlarmManagerExactAndAllowWhileIdle = 104lateinit var pendingIntentExact : PendingIntentlateinit var pendingIntentWindow : PendingIntentlateinit var pendingIntentAndAllowWhileIdle : PendingIntentlateinit var pendingIntentExactAndAllowWhileIdle : PendingIntentcompanion object {// 包裹范围内 属于静态方法val TAG = "MyAlarmManager"val delayTime = 5000val ALARM_ACTION_CODE = "MY_ALARM_ACTION_CODE_STATIC"}init {alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManagerLog.i(TAG, "MyReceiver::class.java.getPackage().name===>>>" + MyReceiver::class.java.getPackage().name)Log.i(TAG, "MyReceiver::class.java.name===>>>" + MyReceiver::class.java.name)initAlarmManagerExact()initAlarmManagerWindow()initAlarmManagerAndAllowWhileIdle()initAlarmManagerExactAndAllowWhileIdle()}fun creatIntentAlarmManager(type : Int):Intent{var intentAlarmManager = Intent(ALARM_ACTION_CODE)intentAlarmManager.putExtra("type", type)
// intentAlarmManager.setComponent(
// ComponentName(
// MyReceiver::class.java.getPackage().name,
// MyReceiver::class.java.name
// )
// )return intentAlarmManager}fun initAlarmManagerExact() {pendingIntentExact = PendingIntent.getBroadcast(context, requestCodeAlarmManagerExact, creatIntentAlarmManager(1), PendingIntent.FLAG_CANCEL_CURRENT)startAlarmManagerExact()}fun startAlarmManagerExact(){Log.i(TAG, "startAlarmManagerExact===>>>")alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() + delayTime, pendingIntentExact)}fun initAlarmManagerWindow() {pendingIntentWindow = PendingIntent.getBroadcast(context, requestCodeAlarmManagerWindow, creatIntentAlarmManager(2), PendingIntent.FLAG_CANCEL_CURRENT)startAlarmManagerWindow()}fun startAlarmManagerWindow(){Log.i(TAG, "startAlarmManagerWindow===>>>")alarmManager.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() + delayTime, SystemClock.elapsedRealtime() + 2*delayTime, pendingIntentWindow)}fun initAlarmManagerAndAllowWhileIdle() {pendingIntentAndAllowWhileIdle = PendingIntent.getBroadcast(context, requestCodeAlarmManagerAndAllowWhileIdle, creatIntentAlarmManager(3), PendingIntent.FLAG_CANCEL_CURRENT)startAlarmManagerAndAllowWhileIdle()}fun startAlarmManagerAndAllowWhileIdle(){Log.i(TAG, "startAlarmManagerAndAllowWhileIdle===>>>")if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {alarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() + delayTime, pendingIntentAndAllowWhileIdle)}}fun initAlarmManagerExactAndAllowWhileIdle() {pendingIntentExactAndAllowWhileIdle = PendingIntent.getBroadcast(context, requestCodeAlarmManagerExactAndAllowWhileIdle, creatIntentAlarmManager(4), PendingIntent.FLAG_CANCEL_CURRENT)startAlarmManagerExactAndAllowWhileIdle()}fun startAlarmManagerExactAndAllowWhileIdle(){Log.i(TAG, "startAlarmManagerExactAndAllowWhileIdle===>>>")if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() + delayTime, pendingIntentExactAndAllowWhileIdle)}}
}
如下是运行日志
2021-09-01 19:31:50.582 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:31:50.582 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:31:50.597 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=4] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:31:50.597 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExactAndAllowWhileIdle===>>>
2021-09-01 19:31:55.588 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:31:55.588 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:31:55.596 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=3] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:31:55.596 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerAndAllowWhileIdle===>>>
2021-09-01 19:32:00.603 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=4] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:00.603 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExactAndAllowWhileIdle===>>>
2021-09-01 19:32:00.614 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:00.614 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:32:05.594 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=2] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:05.594 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerWindow===>>>
2021-09-01 19:32:05.603 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=3] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:05.604 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerAndAllowWhileIdle===>>>
2021-09-01 19:32:05.621 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:05.622 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:32:10.593 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=4] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:10.594 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExactAndAllowWhileIdle===>>>
2021-09-01 19:32:10.626 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:10.626 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:32:15.593 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=3] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:15.594 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerAndAllowWhileIdle===>>>
2021-09-01 19:32:15.632 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:15.632 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:32:20.594 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=4] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:20.594 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExactAndAllowWhileIdle===>>>
2021-09-01 19:32:20.636 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:20.636 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:32:25.593 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=3] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:25.593 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerAndAllowWhileIdle===>>>
2021-09-01 19:32:25.656 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:25.656 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:32:30.593 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=4] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:30.594 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExactAndAllowWhileIdle===>>>
2021-09-01 19:32:30.661 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:30.661 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:32:35.593 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=3] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:35.593 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerAndAllowWhileIdle===>>>
2021-09-01 19:32:35.668 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:32:35.669 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>adb shell dumpsys deviceidle force-idle
2021-09-01 19:41:35.594 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=3] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:41:35.595 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerAndAllowWhileIdle===>>>
2021-09-01 19:41:35.605 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=4] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:41:35.605 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExactAndAllowWhileIdle===>>>adb shell dumpsys deviceidle unforce
2021-09-01 19:42:43.850 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=2] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:43.850 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerWindow===>>>
2021-09-01 19:42:43.874 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:43.874 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:42:43.886 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=3] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:43.886 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerAndAllowWhileIdle===>>>
2021-09-01 19:42:43.896 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=4] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:43.896 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExactAndAllowWhileIdle===>>>
2021-09-01 19:42:48.879 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:48.880 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:42:48.894 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=2] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:48.894 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerWindow===>>>
2021-09-01 19:42:48.921 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=3] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:48.922 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerAndAllowWhileIdle===>>>
2021-09-01 19:42:53.885 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=1] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:53.885 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExact===>>>
2021-09-01 19:42:53.898 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=4] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:53.898 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerExactAndAllowWhileIdle===>>>
2021-09-01 19:42:53.925 28954-28954/com.kxf.alarmmanagertest I/MyReceiver: AlarmManager BroadcastReceiver intent= [type=2] [android.intent.extra.ALARM_COUNT=1]
2021-09-01 19:42:53.926 28954-28954/com.kxf.alarmmanagertest I/MyAlarmManager: startAlarmManagerWindow===>>>
从日志中可以看出,从 Android 6.0(API 级别 23)开始,adb shell dumpsys deviceidle force-idle执行完成后,只有setAndAllowWhileIdle和setExactAndAllowWhileIdle能收到闹钟的广播,并且接收的时间间隔不能小于9分钟!
参考链接 https://developer.android.com/reference/android/app/AlarmManager
https://developer.android.com/training/monitoring-device-state/doze-standby
AlarmManager针对低电耗模式和应用待机模式进行优化相关推荐
- (两百七十)学习 针对低电耗模式和应用待机模式进行优化
https://developer.android.google.cn/training/monitoring-device-state/doze-standby 针对低电耗模式和应用待机模式进行优化 ...
- 【Android 电量优化】电量优化特性 ( Doze 低电耗模式 | Standby 应用待机模式 | 白名单设置 | 白名单添加系统设置界面 | 指定应用的白名单添加界面 | 测试应用 )
文章目录 一.Doze 低耗电模式简介 二.Standby 应用待机模式简介 三.Doze 和 Standby 模式测试 四.白名单添加 ( 方式一 ) 五.白名单添加 ( 方式二 ) Android ...
- Android 功耗优化(4)---android 7.0低电耗Doze模式
android 7.0低电耗Doze模式 从 Android 6.0(API 级别 23)开始,Android 引入了两个省电功能,可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命. 低 ...
- 安卓 省电模式、低电耗(Doze)模式、应用待机(standby)模式、唤醒锁
省电模式 省电模式是系统里的一个开关,开启后会降低设备的性能,限制后台应用的活动和数据同步(如邮件接收),并限制GPS访问. 用户可以主动开启省电模式,也可以设置电量少于一定程度是自动开启省电模式. ...
- Android电量优化(1)——了解低电耗模式
文章目录 了解低电耗模式 将应用调整到低电耗模式 了解应用待机模式 对其他用例的支持 在低电耗模式和应用待机模式下进行测试 了解低电耗模式 如果用户设备未插接电源.处于静止状态一段时间且屏幕关闭,设备 ...
- Android 6.0 低电耗模式 和 待机(休眠)模式
因为公司项目在做VOIP网络电话功能, 所以就涉及到后台常驻服务: 驻留一个服务, 等待有网络电话打进来. 探索了多种后台常驻技术手段... 在使用了现阶段能用的后台常驻服务手段后(用户感知比较强烈那 ...
- 【Android 低电耗/Doze原理---设备运动状态和位置对Doze模式的影响】
Android 低电耗/Doze原理---设备运动状态和位置对Doze模式的影响 基础知识 Deep Idle的状态机 STATE_IDLE_PENDING----监听运动状态变化 STATE_SEN ...
- 耗电量统计:可构建低电耗应用-Battery Historian
官方解说 新的作业调度 API 支持您将系统作业推迟到后期或特定情况(例如,设备在充电或已连接到 Wi-Fi),从而最大延长电池寿命. 新的 dumpsys batterystats 命令会生成耗电量 ...
- android 4.3低吗,Android 4.3两新特征曝光:低电耗蓝牙功能
按照惯例,谷歌将于5月15日召开发者大会上发布新一代安卓系统(TechWeb配图) [TechWeb报道]5月6日消息,据国外媒体报道,"洛杉矶安卓讨论会"(San Francis ...
最新文章
- java版spring cloud+spring boot+redis多租户社交电子商务平
- 10.27T2 线性DP+拆分
- 删库不跑路,MySQL 数据库恢复教程
- sqlserver中编写自定义函数中的返回值问题
- linux 条件变量函数,Linux线程同步之条件变量
- mysql自增id获取失败
- 【计算机组成原理】虚拟存储器和Cache的比较
- C++:求第k小的数
- linux禁用ssh弱加密算法,SSHSSL弱加密算法漏洞修复
- 这个网站还不错,可以多看看(这个是学习的网站,没有广告)
- 大一计算机理论知识测试题,2017计算机基础大一考试试题「附答案」
- NXP Kinetis的 单片机LPUART 模块调试记录
- JAVA 10.28.2017
- android开发界面设计工具,21个免费的UI界面设计工具、资源及网站
- BPI 流程优化和BPR流程重组
- OpenDDS和RTI DDS内置数据类型的互联互通测试
- java英文时间格式转换yyyymmdd格式
- Sign in With Apple (苹果授权登录)
- SkeyeVSS综合安防监控Onvif、RTSP、GB28181视频云无插件直播点播解决方案之子系统微服务集群解决方案
- Leetcode 312. 戳气球(经典区间dp)