Most visited

Recently visited

Added in API level 1

PowerManager

public final class PowerManager
extends Object

java.lang.Object
   ↳ android.os.PowerManager


该类可让您控制设备的电源状态。

设备电池寿命将受到使用此API的显着影响。 除非你真的需要它们,否则不要购买PowerManager.WakeLock ,尽可能使用最低水平,并尽可能快地释放它们。

你可以通过调用 Context.getSystemService()来获得这个类的一个实例。

您将使用的主要API是newWakeLock() 这将创建一个PowerManager.WakeLock对象。 然后,您可以使用唤醒锁对象上的方法来控制设备的电源状态。

在实践中它很简单:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
 PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
 wl.acquire();
   ..screen will stay on during this section..
 wl.release();
 

定义了以下唤醒锁定级别,对系统功率有不同的影响。 这些级别是相互排斥的 - 你只能指定其中的一个。

Flag Value CPU Screen Keyboard
PARTIAL_WAKE_LOCK On* Off Off
SCREEN_DIM_WAKE_LOCK On Dim Off
SCREEN_BRIGHT_WAKE_LOCK On Bright Off
FULL_WAKE_LOCK On Bright Bright

* 如果您保持部分唤醒锁定,无论显示超时或屏幕状态,甚至用户按下电源按钮后,CPU都将继续运行。 在所有其他唤醒锁中,CPU将运行,但用户仍然可以使用电源按钮使设备进入睡眠状态。

另外,您可以添加两个更多的标志,这些标志只影响屏幕的行为。 PARTIAL_WAKE_LOCK结合使用时,这些标志PARTIAL_WAKE_LOCK

Flag Value 描述
ACQUIRE_CAUSES_WAKEUP Normal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.
ON_AFTER_RELEASE If this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling between wake lock conditions.

任何使用WakeLock的应用程序都必须请求应用程序清单的 <uses-permission>元素中的 android.permission.WAKE_LOCK权限。

Summary

Nested classes

class PowerManager.WakeLock

唤醒锁是一种机制,用于指示您的应用程序需要使设备保持开启状态。

Constants

int ACQUIRE_CAUSES_WAKEUP

唤醒锁定标志:获取唤醒锁定时打开屏幕。

String ACTION_DEVICE_IDLE_MODE_CHANGED

isDeviceIdleMode()的状态改变时广播的意图。

String ACTION_POWER_SAVE_MODE_CHANGED

isPowerSaveMode()的状态发生变化时广播的意图。

int FULL_WAKE_LOCK

此常数在API级别17中已弃用。大多数应用程序应使用FLAG_KEEP_SCREEN_ON而不是此类型的唤醒锁定,因为用户在应用程序之间移动时不会由于平台正确管理而需要特殊权限。

int ON_AFTER_RELEASE

唤醒锁定标志:释放此唤醒锁定时,戳动用户活动计时器,使屏幕保持点亮状态。

int PARTIAL_WAKE_LOCK

唤醒锁定级别:确保CPU正在运行; 屏幕和键盘背光将被允许熄灭。

int PROXIMITY_SCREEN_OFF_WAKE_LOCK

唤醒锁定电平:当接近传感器激活时关闭屏幕。

int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY

标记为 WakeLock.release(int) :推迟释放 PROXIMITY_SCREEN_OFF_WAKE_LOCK唤醒锁,直到接近传感器指示物体不是非常接近。

int SCREEN_BRIGHT_WAKE_LOCK

此常量在API级别13中已弃用。大多数应用程序应使用FLAG_KEEP_SCREEN_ON而不是此类型的唤醒锁定,因为用户在应用程序之间移动并且不需要特殊许可时,平台会正确管理平台。

int SCREEN_DIM_WAKE_LOCK

此常数在API级别17中已弃用。大多数应用程序应使用FLAG_KEEP_SCREEN_ON而不是此类型的唤醒锁定,因为用户在应用程序之间移动并且不需要特别许可时,平台会正确管理平台。

Public methods

boolean isDeviceIdleMode()

如果设备当前处于空闲模式,则返回true。

boolean isIgnoringBatteryOptimizations(String packageName)

返回给定的应用程序包名称是否在设备的电源白名单上。

boolean isInteractive()

如果设备处于交互式状态,则返回true。

boolean isPowerSaveMode()

如果设备当前处于省电模式,则返回true。

boolean isScreenOn()

此方法在API级别20中已弃用。请改用isInteractive()

boolean isSustainedPerformanceModeSupported()

该功能检查设备是否实施了持续性能模式。

boolean isWakeLockLevelSupported(int level)

如果支持指定的唤醒锁定级别,则返回true。

PowerManager.WakeLock newWakeLock(int levelAndFlags, String tag)

用指定的级别和标志创建一个新的唤醒锁。

void reboot(String reason)

重新启动设备。

Inherited methods

From class java.lang.Object

Constants

ACQUIRE_CAUSES_WAKEUP

Added in API level 1
int ACQUIRE_CAUSES_WAKEUP

唤醒锁定标志:获取唤醒锁定时打开屏幕。

通常情况下,唤醒锁实际上不会唤醒设备,它们只会导致屏幕一旦打开就保持打开状态。 将视频播放器应用程序视为正常行为。 弹出并希望设备处于打开状态的通知是例外; 使用这个标志就像他们一样。

不能与 PARTIAL_WAKE_LOCK一起使用。

常量值:268435456(0x10000000)

ACTION_DEVICE_IDLE_MODE_CHANGED

Added in API level 23
String ACTION_DEVICE_IDLE_MODE_CHANGED

isDeviceIdleMode()的状态改变时广播的意图。 这个广播只发送给已注册的接收者。

常量值:“android.os.action.DEVICE_IDLE_MODE_CHANGED”

ACTION_POWER_SAVE_MODE_CHANGED

Added in API level 21
String ACTION_POWER_SAVE_MODE_CHANGED

isPowerSaveMode()的状态改变时广播的意图。 这个广播只发送给已注册的接收者。

常量值:“android.os.action.POWER_SAVE_MODE_CHANGED”

FULL_WAKE_LOCK

Added in API level 1
int FULL_WAKE_LOCK

此常数在API级别17中已弃用。
大多数应用程序应该使用FLAG_KEEP_SCREEN_ON而不是这种类型的唤醒锁,因为当用户在应用程序之间移动时,它将被平台正确管理,并且不需要特殊许可。

唤醒锁定等级:确保屏幕和键盘背光完全亮起。

如果用户按下电源按钮,则FULL_WAKE_LOCK将隐式释放FULL_WAKE_LOCK ,导致屏幕和CPU都被关闭。 PARTIAL_WAKE_LOCK对比。

常量值:26(0x0000001a)

ON_AFTER_RELEASE

Added in API level 1
int ON_AFTER_RELEASE

唤醒锁定标志:释放此唤醒锁定时,戳动用户活动计时器,使屏幕保持点亮状态。

如果尚未打开,则不会打开屏幕。 如果您需要,请参阅ACQUIRE_CAUSES_WAKEUP

不能与 PARTIAL_WAKE_LOCK一起使用。

常量值:536870912(0x20000000)

PARTIAL_WAKE_LOCK

Added in API level 1
int PARTIAL_WAKE_LOCK

唤醒锁定级别:确保CPU正在运行; 屏幕和键盘背光将被允许熄灭。

如果用户按下电源按钮,则屏幕将被关闭,但CPU将保持打开状态,直到所有部分唤醒锁已释放。

常数值:1(0x00000001)

PROXIMITY_SCREEN_OFF_WAKE_LOCK

Added in API level 21
int PROXIMITY_SCREEN_OFF_WAKE_LOCK

唤醒锁定电平:当接近传感器激活时关闭屏幕。

如果接近传感器检测到物体在附近,则屏幕立即关闭。 物体移开后不久,屏幕再次打开。

近程唤醒锁不会防止设备入睡不像FULL_WAKE_LOCKSCREEN_BRIGHT_WAKE_LOCKSCREEN_DIM_WAKE_LOCK 如果没有用户活动并且没有其他唤醒锁被保持,则该设备将像往常一样睡着(并锁定)。 但是,当屏幕被接近传感器关闭时,设备不会入睡,因为它实际上被视为正在进行的用户活动。

由于并非所有设备都有接近传感器,因此请使用 isWakeLockLevelSupported(int)来确定是否支持此唤醒锁定级别。

不能与 ACQUIRE_CAUSES_WAKEUP一起使用。

常量值:32(0x00000020)

RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY

Added in API level 21
int RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY

标记为 WakeLock.release(int) :推迟释放 PROXIMITY_SCREEN_OFF_WAKE_LOCK唤醒锁,直到接近传感器指示物体不是非常接近。

常数值:1(0x00000001)

SCREEN_BRIGHT_WAKE_LOCK

Added in API level 1
int SCREEN_BRIGHT_WAKE_LOCK

此常数在API级别13中已弃用。
大多数应用程序应该使用FLAG_KEEP_SCREEN_ON而不是这种类型的唤醒锁,因为它将由平台正确管理,因为用户在应用程序之间移动并且不需要特殊许可。

唤醒锁定等级:确保屏幕全亮; 键盘背光将被允许熄灭。

If the user presses the power button, then the SCREEN_BRIGHT_WAKE_LOCK will be implicitly released by the system, causing both the screen and the CPU to be turned off. Contrast with PARTIAL_WAKE_LOCK.

常量值:10(0x0000000a)

SCREEN_DIM_WAKE_LOCK

Added in API level 1
int SCREEN_DIM_WAKE_LOCK

此常数在API级别17中已弃用。
大多数应用程序应该使用FLAG_KEEP_SCREEN_ON而不是这种类型的唤醒锁,因为当用户在应用程序之间移动时,它将被平台正确管理,并且不需要特殊许可。

唤醒锁定级别:确保屏幕开启(但可能变暗); 键盘背光将被允许熄灭。

如果用户按下电源按钮,则SCREEN_DIM_WAKE_LOCK将隐式释放SCREEN_DIM_WAKE_LOCK ,导致屏幕和CPU都被关闭。 PARTIAL_WAKE_LOCK对比。

常数值:6(0x00000006)

Public methods

isDeviceIdleMode

Added in API level 23
boolean isDeviceIdleMode ()

如果设备当前处于空闲模式,则返回true。 这种情况发生在设备未使用并且没有长时间不动的情况下,因此它决定进入低功耗状态。 这可能涉及诸如关闭网络应用程序访问权限等内容。 您可以使用ACTION_DEVICE_IDLE_MODE_CHANGED来监视对此状态的ACTION_DEVICE_IDLE_MODE_CHANGED

Returns
boolean Returns true if currently in active device idle mode, else false. This is when idle mode restrictions are being actively applied; it will return false if the device is in a long-term idle mode but currently running a maintenance window where restrictions have been lifted.

isIgnoringBatteryOptimizations

Added in API level 23
boolean isIgnoringBatteryOptimizations (String packageName)

返回给定的应用程序包名称是否在设备的电源白名单上。 可以通过ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS调用的设置UI将应用放置在白名单中。

Parameters
packageName String
Returns
boolean

isInteractive

Added in API level 20
boolean isInteractive ()

如果设备处于交互式状态,则返回true。

当此方法返回true时,设备处于唤醒状态并准备好与用户进行交互(尽管这不能保证用户只是在此刻与设备进行交互)。 主屏幕通常处于此状态。 某些功能(如接近传感器)可能会暂时关闭屏幕,同时仍使设备保持交互状态。 特别要注意的是,设备在梦中仍然被认为是互动的(因为梦可以是互动的),但是当它打瞌睡或睡着时不会。

当此方法返回false时,设备打瞌睡或睡着,必须先唤醒才能准备好再次与用户进行交互。 在此状态下,主屏幕通常会关闭。 某些功能(如“环境模式”)可能会导致主屏幕保持打开(尽管处于低功耗状态),以在设备打盹时显示系统提供的内容。

只要设备的交互状态发生变化,系统就会发送screen onscreen off广播。 由于历史原因,这些广播的名称是指屏幕的电源状态,但实际上它们是响应设备整体交互状态的变化而发送的,如本方法所述。

由于用户不在场,因此服务可以使用非交互式状态作为提示以节省电力。

Returns
boolean True if the device is in an interactive state.

也可以看看:

isPowerSaveMode

Added in API level 21
boolean isPowerSaveMode ()

如果设备当前处于省电模式,则返回true。 处于此模式时,应用程序应尽可能减少其功能以节省电池电量。 您可以使用ACTION_POWER_SAVE_MODE_CHANGED监视此状态的ACTION_POWER_SAVE_MODE_CHANGED

Returns
boolean Returns true if currently in low power mode, else false.

isScreenOn

Added in API level 7
boolean isScreenOn ()

此方法在API级别20中已被弃用。
改为使用isInteractive()

如果设备处于交互式状态,则返回true。

由于历史原因,此方法的名称是指屏幕的电源状态,但它实际上描述了设备的整体交互状态。 此方法已由isInteractive()取代。

此方法返回的值仅指示设备是否处于交互状态,与屏幕打开或关闭无关。 要确定屏幕的实际状态,请使用getState()

Returns
boolean True if the device is in an interactive state.

isSustainedPerformanceModeSupported

Added in API level 24
boolean isSustainedPerformanceModeSupported ()

该功能检查设备是否实施了持续性能模式。 这只需要检查一次,并且对于特定的设备/版本是恒定的。 持续性能模式旨在为持续时间提供一致的性能水平。 在使用setSustainedPerformanceMode(boolean)之前,应用程序应检查设备是否支持此模式。

Returns
boolean Returns True if the device supports it, false otherwise.

也可以看看:

isWakeLockLevelSupported

Added in API level 21
boolean isWakeLockLevelSupported (int level)

如果支持指定的唤醒锁定级别,则返回true。

Parameters
level int: The wake lock level to check.
Returns
boolean True if the specified wake lock level is supported.

newWakeLock

Added in API level 1
PowerManager.WakeLock newWakeLock (int levelAndFlags, 
                String tag)

用指定的级别和标志创建一个新的唤醒锁。

levelAndFlags参数指定唤醒锁定级别和使用逻辑OR运算符组合的可选标志。

唤醒锁级别为: PARTIAL_WAKE_LOCKFULL_WAKE_LOCKSCREEN_DIM_WAKE_LOCKSCREEN_BRIGHT_WAKE_LOCK 必须将一个唤醒锁定级别指定为levelAndFlags参数的一部分。

唤醒锁标志是: ACQUIRE_CAUSES_WAKEUPON_AFTER_RELEASE 可以将多个标志组合为levelAndFlags参数的一部分。

呼叫 acquire()收购之后锁定的对象,并 release()当您完成。

PowerManager pm = (PowerManager)mContext.getSystemService(
                                          Context.POWER_SERVICE);
 PowerManager.WakeLock wl = pm.newWakeLock(
                                      PowerManager.SCREEN_DIM_WAKE_LOCK
                                      | PowerManager.ON_AFTER_RELEASE,
                                      TAG);
 wl.acquire();
 // ... do work...
 wl.release();
 

虽然可以在没有特殊权限的情况下创建唤醒锁,但需要 WAKE_LOCK权限才能实际获取或释放返回的唤醒锁。

如果使用它来保持屏幕FLAG_KEEP_SCREEN_ON ,则应该强烈考虑使用FLAG_KEEP_SCREEN_ON 当用户在应用程序之间移动时,此窗口标志将由平台正确管理,并且不需要特殊许可。

Parameters
levelAndFlags int: Combination of wake lock level and flag values defining the requested behavior of the WakeLock.
tag String: Your class name (or other tag) for debugging purposes.
Returns
PowerManager.WakeLock

也可以看看:

reboot

Added in API level 8
void reboot (String reason)

重新启动设备。 如果重新启动成功,则不会返回。

需要 REBOOT权限。

Parameters
reason String: code to pass to the kernel (e.g., "recovery") to request special boot modes, or null.

Hooray!