android PowerManager(电源管理) wakelock(屏幕锁) .

合集下载

Android6.0 wakelock深入分析

Android6.0 wakelock深入分析

Android6.0 wakelock深入分析一、PowerManager的持锁接口我们先来看下PowerManager对应用提供的接口:[cpp] view plain copy 在CODE上查看代码片派生到我的代码片public WakeLock newWakeLock(int levelAndFlags, String tag) {validateWakeLockParameters(levelAndFlags, tag);//验证wakelock的flag是否有效return new WakeLock(levelAndFlags, tag, mContext.getOpPackageName());}validateWakeLockParameters函数如下:主要对flag没有下面这些flag做过滤[cpp] view plain copy 在CODE上查看代码片派生到我的代码片public static void validateWakeLockParameters(int levelAndFlags, String tag) { switch (levelAndFlags & WAKE_LOCK_LEVEL_MASK) {case PARTIAL_WAKE_LOCK://cpu锁case SCREEN_DIM_WAKE_LOCK://屏幕微亮,键盘暗case SCREEN_BRIGHT_W AKE_LOCK://屏幕亮,键盘暗case FULL_WAKE_LOCK://全亮case PROXIMITY_SCREEN_OFF_WAKE_LOCK:case DOZE_WAKE_LOCK:case DRAW_WAKE_LOCK:break;default:throw new IllegalArgumentException("Must specify a valid wake lock level.");}if (tag == null) {throw new IllegalArgumentException("The tag must not be null.");}}我们再看WakeLock类,先看下面两个持锁,第二个timeout的持锁,先持锁,然后发送一个延迟消息再解锁。

Android中系统自带锁WalkLock与KeyguardLock用法实例详解

Android中系统自带锁WalkLock与KeyguardLock用法实例详解

Android中系统⾃带锁WalkLock与KeyguardLock⽤法实例详解本⽂实例讲述了Android中系统⾃带锁WalkLock与KeyguardLock⽤法。

分享给⼤家供⼤家参考,具体如下:WalkLock - 顾名思义唤醒锁点亮屏幕⽤的 KeyguardLock - 顾名思义键盘锁解锁键盘⽤的详细介绍:1: WalkLock 唤醒锁- WalkLock真的能点亮屏幕吗?答案是肯定的。

可是有时候为什么不点亮屏幕,这个就是参数设置的问题了。

复制代码代码如下:PowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Gank");PowerManager.FULL_WAKE_LOCK 这个参数是⼿机点亮的程度,(什么Cpu,屏幕亮度,键盘灯)PowerManager.ACQUIRE_CAUSES_WAKEUP 关键是这个参数的理解。

WalkLock点亮屏幕并⾮真的去点亮了屏幕,你可以理解为,它通过Android组件(Activity)去点亮了屏幕。

假如⼀个通知想去点亮屏幕,问题来了,它能点亮吗?肯定不⾏。

不过拥有这个PowerManager.ACQUIRE_CAUSES_WAKEU参数,你就可以点亮屏幕了。

它使WalkLock不再依赖组件就可以点亮屏幕了。

- WalkLock如何获得屏幕的状态?PowerManager.isScreenOn()⽅法;这个⽅法返回true: 屏幕是唤醒的返回false:屏幕是休眠的- WalkLock唤醒和休眠的⽅法?WalkLock.aquire() 在屏幕休眠的状态下唤醒屏幕WalkLock.release() 在屏幕点亮的状态下,使屏幕休眠。

WalkLock.release()这个⽅法有个需要注意的地⽅:例如:WalkLockA对象先唤醒了屏幕再使屏幕休眠,ok没问题屏幕本⾝就是唤醒状态,WalkLockA对象没有唤醒过屏幕,WalkLockA对象如果尝试使屏幕休眠。

android休眠唤醒流程2

android休眠唤醒流程2

android休眠唤醒流程2android系统⼀段时间没有操作,屏幕(screen)将从⾼亮(bright)变为暗淡(dim),如果再过段时间还是没有操作,屏幕(screen)从暗淡(dim)变为关闭(off).这时,系统将进⼊休眠.⽽对于某些需要保持系统唤醒甚⾄屏幕唤醒的应⽤(⽐如视频播放器和⾳乐播放器)来说,就必须要有⼀个机制,使得系统不进⼊休眠状态,设置保持屏幕亮屏状态.wakelock即⽤来实现以上⽬的先上⽹上偷来的⼀副图,说⼀下android系统的整个电源管理流程图接下来对每⼀个模块具体分析:powermanager对应⽂件是android/frameworks/base/core/java/android/os/PowerManager.java在Android中应⽤程序并不是直接同PowerManagerService交互的,⽽是通过PowerManager间接地与PowerManagerService打交道。

此⽂件定义了⼀个powermanager类.主要实现了1,wakelock的申请与释放public WakeLock newWakeLock(int flags, String tag)2,系统延时进⼊休眠public void userActivity(long when, boolean noChangeLights)3,系统强制休眠public void goToSleep(long time)4,屏幕亮度设置public void setBacklightBrightness(int brightness)5,屏幕状态查询public boolean isScreenOn()6,系统重启public void reboot(String reason)细节wakelock的申请与释放{@samplecode*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();* // ...*wl.release();⼀共有如下⼏个flag来进⾏不⼀样的唤醒⽅式.可以根据需要设置Flag Value CPU Screen KeyboardPARTIAL_WAKE_LOCK On* can-off OffSCREEN_DIM_WAKE_LOCK On Dim OffPROXIMITY_SCREEN_OFF_WAKE_LOCK on 距离传感器时关闭 offSCREEN_BRIGHT_WAKE_LOCK On Bright OffFULL_WAKE_LOCK On Bright BrightACQUIRE_CAUSES_WAKEUP 确保wakelock,主要⽤于视频播放器ON_AFTER_RELEASE = 0x20000000 release后倒计时,关闭屏幕...userActivity的作⽤:使系统从其他状态进⼊全部打开状态,⽐如从暗屏(dim)切换到亮屏,并重置倒计时计数器(待续)。

Android7.0PowerManagerService之亮灭屏(一)

Android7.0PowerManagerService之亮灭屏(一)

Android7.0PowerManagerService之亮灭屏(⼀)本篇从按下power按键后,按键事件从InputManagerService 传到PhoneWindowManager.java开始分析power 按键做屏幕亮灭过程的分析,关于power 按键的其他⾏为参考另⼀篇博⽂()(注:博客园显⽰的图⽚很模糊,上传的为⼤图,可以图⽚另存为查看)⾔归正传,本篇涉及的⼏个模块(⽂件)如下,先做个简单的介绍有个直观⼤概的了解,⽅便后⾯流程细节的理解。

Ø PowerManagerService.Java:(/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java) PMS,是Android系统中的电源处理服务,主要负责电源相关的计算和决策,如是否应该灭屏或者让屏幕变暗,是否应该让系统休眠等等。

Ø DisplayPowerController.java:(/frameworks/base/services/core/java/com/android/server/display/DisplayPowerController.java) DPC,管理显⽰设备(这⾥指的显⽰设备是屏幕)状态,主要处理距离传感器(如打电话时候靠近则灭屏,离开时候屏幕亮起)以及亮灭屏动画(包括根据光感传感器计算屏幕⽬标亮度值)。

在DisplayManagerService.java(DMS)中实例化⼀个对象,以DMS为桥梁与PMS进⾏交互通过异步回调机制来通知PMS那些发⽣了改变。

同时也与WMS进⾏交互。

Ø DisplayPowerState.java:(/frameworks/base/services/core/java/com/android/server/display/DisplayPowerState.java) DPS,管理显⽰设备的状态仅在DPC中实例化⼀个对象,是DPC的⼀部分。

Android熄屏与亮屏控制

Android熄屏与亮屏控制

Android熄屏与亮屏控制目前做一个电子班牌的项目,需要做到熄屏与亮屏,网上找了很多,都是利用PowerManager,但是需要系统权限,这个比较麻烦,后面找到一个,测试发现可行的方案,就是利用设备管理器DevicePolicyManager执行熄屏,利用PowerManager进行亮屏,下面是步骤与代码。

1.注册:DeviceAdminReceiver<receiverandroid:name=".sreencontroldemo.Sc reenOffAdminReceiver"android:label="@string/app_name"android:permission="android.permission.BIND_DEVICE_AD MIN" ><meta-dataandroid:name="android.app.device_admin"android:resource="@xml/device_admin" /><intent-filter><actionandroid:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter></receiver>ScreenOffAdminReceiver为继承DeviceAdminReceiver:public class ScreenOffAdminReceiver extends DeviceAdminReceiver {private void showT oast(Context context, String msg) {Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();}@Overridepublic void onEnabled(Context context, Intent intent) { showToast(context,"设备管理器使能");}@Overridepublic void onDisabled(Context context, Intent intent) { showToast(context,"设备管理器没有使能");}}device_admin为device_admin.xml,在res/xml文件夹下面:<?xml version="1.0" encoding="utf-8"?><device-admin xmlns:android="/apk/res/android"><uses-policies><limit-password /><reset-password /><force-lock /></uses-policies></device-admin>2.xml代码:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android" xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".sreencontroldemo.Ma inActivity"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="checkScreen"android:text="检测屏幕状态" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="checkScreenOn"android:text="亮屏" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="checkScreenOff"android:text="熄屏" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="checkScreenOffAndDelayOn"android:text="熄屏后再亮屏" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="checkAndTurnOnDeviceManager"android:text="去启动设备管理器权限" /></LinearLayout>3.MainActivity代码:public class MainActivity extends AppCompatActivity {private String tag = "MainActivity";private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case 1:checkScreenOn(null);break;case 2:break;}}};private DevicePolicyManager policyManager;private ComponentName adminReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);adminReceiver = new ComponentName(MainActivity.this, ScreenOffAdminReceiver.class);mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);policyManager = (DevicePolicyManager) MainActivity.this.getSystemService(Context.DEVICE_POLICY_SER VICE);checkAndTurnOnDeviceManager(null);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);isOpen();}private void isOpen() {if (policyManager.isAdminActive(adminReceiver)) {//判断超级管理员是否激活showToast("设备已被激活");} else {showToast("设备没有被激活");}}private PowerManager mPowerManager;private PowerManager.WakeLock mWakeLock;/*** @param view 检测屏幕状态*/public void checkScreen(View view) {PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);boolean screenOn = pm.isScreenOn();if (!screenOn) {//如果灭屏//相关操作showToast("屏幕是息屏");} else {showToast("屏幕是亮屏");}}/*** @param view 亮屏*/public void checkScreenOn(View view) {mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT _WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");mWakeLock.acquire();mWakeLock.release();}/*** @param view 熄屏*/public void checkScreenOff(View view) {boolean admin = policyManager.isAdminActive(adminReceiver);if (admin) {policyManager.lockNow();} else {showToast("没有设备管理权限");}}/*** @param view 熄屏并延时亮屏*/public void checkScreenOffAndDelayOn(View view) {boolean admin = policyManager.isAdminActive(adminReceiver);if (admin) {policyManager.lockNow();handler.sendEmptyMessageDelayed(1, 3000);} else {showToast("没有设备管理权限");}}/*** @param view 检测并去激活设备管理器权限*/public void checkAndTurnOnDeviceManager(View view) {Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMI N, adminReceiver);intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANA TION, "开启后就可以使用锁屏功能了...");//显示位置见图二startActivityForResult(intent, 0);}private void showT oast(String Str) {Toast.makeText(this, Str, Toast.LENGTH_SHORT).show();}}4.发现的问题如果手机有屏保,熄屏后再亮屏会显示屏保。

Android中保持屏幕常亮的方法

Android中保持屏幕常亮的方法

Android中保持屏幕常亮的⽅法⼀、简要记录下,Android中保持屏幕常亮的⽅法:1、作⽤于View的:setKeepScreenOn(true/false),同样可以在xml中设置android:keepScreenOn="",只要View可见即⽣效。

2、通过添加flag的形式实现:添加:mActivity.getWindow().addFlags(youtParams.FLAG_KEEP_SCREEN_ON);清除:getWindow().clearFlags(youtParams.FLAG_KEEP_SCREEN_ON);3、使⽤PowerManager.WakeLock:PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);if (powerManager != null) {wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "WakeLock"); wakeLock.acquire(); //开启屏幕常亮 //wakeLock.release(); //释放wakeLock,注意此⽅法可能出现异常.具体可看源码} 在⾃测⼿机中并未出现异常,也就是说,并⾮⼀定不可以连续调⽤wakeLock.acquire()和wakeLock.release()。

4、第三种官⽅已经不推荐使⽤,建议使⽤上述1、2两种⽅法。

⼆、其他:1、在视频录制或播放中,MediaPlayer提供了相关⽅法实现屏幕常亮,具体如下: mMediaPlayer.setScreenOnWhilePlaying(true);源码如下:/*** Control whether we should use the attached SurfaceHolder to keep the* screen on while video playback is occurring. This is the preferred* method over {@link #setWakeMode} where possible, since it doesn't* require that the application have permission for low-level wake lock* access.** @param screenOn Supply true to keep the screen on, false to allow it* to turn off.*/public void setScreenOnWhilePlaying(boolean screenOn) {if (mScreenOnWhilePlaying != screenOn) {if (screenOn && mSurfaceHolder == null) {Log.w(TAG, "setScreenOnWhilePlaying(true) is ineffective without a SurfaceHolder");}mScreenOnWhilePlaying = screenOn;updateSurfaceScreenOn(); //#}} ......private void updateSurfaceScreenOn() {if (mSurfaceHolder != null) { mSurfaceHolder.setKeepScreenOn(mScreenOnWhilePlaying && mStayAwake); //#}}2、附上WakeLock的部分源码,它是PowerManager的内部类,可重点查看release(...):public final class WakeLock {......private boolean mRefCounted = true; //默认true......WakeLock(int flags, String tag, String packageName) {mFlags = flags;mTag = tag;mPackageName = packageName;mToken = new Binder(); //⽤于同步synchronizedmTraceName = "WakeLock (" + mTag + ")";}@Overrideprotected void finalize() throws Throwable {synchronized (mToken) {if (mHeld) {Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);try {mService.releaseWakeLock(mToken, 0);} catch (RemoteException e) {}}}}/*** Sets whether this WakeLock is reference counted.* <p>* Wake locks are reference counted by default. If a wake lock is* reference counted, then each call to {@link #acquire()} must be* balanced by an equal number of calls to {@link #release()}. If a wake* lock is not reference counted, then one call to {@link #release()} is* sufficient to undo the effect of all previous calls to {@link #acquire()}.* </p>** @param value True to make the wake lock reference counted, false to* make the wake lock non-reference counted.*/public void setReferenceCounted(boolean value) {synchronized (mToken) {mRefCounted = value;}}/*** Acquires the wake lock.* <p>* Ensures that the device is on at the level requested when* the wake lock was created.* </p>*/public void acquire() {synchronized (mToken) {acquireLocked();}}/*** Acquires the wake lock with a timeout.* <p>* Ensures that the device is on at the level requested when* the wake lock was created. The lock will be released after the given timeout* expires.* </p>** @param timeout The timeout after which to release the wake lock, in milliseconds.*/public void acquire(long timeout) {synchronized (mToken) {acquireLocked();mHandler.postDelayed(mReleaser, timeout);}}private void acquireLocked() {if (!mRefCounted || mCount++ == 0) {// Do this even if the wake lock is already thought to be held (mHeld == true)// because non-reference counted wake locks are not always properly released.// For example, the keyguard's wake lock might be forcibly released by the// power manager without the keyguard knowing. A subsequent call to acquire// should immediately acquire the wake lock once again despite never having// been explicitly released by the keyguard.mHandler.removeCallbacks(mReleaser);Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, mTraceName, 0);try {mService.acquireWakeLock(mToken, mFlags, mTag, mPackageName, mWorkSource, mHistoryTag);} catch (RemoteException e) {}mHeld = true;}}/*** Releases the wake lock.* <p>* This method releases your claim to the CPU or screen being on.* The screen may turn off shortly after you release the wake lock, or it may* not if there are other wake locks still held.* </p>*/public void release() {release(0);}/*** Releases the wake lock with flags to modify the release behavior.* <p>* This method releases your claim to the CPU or screen being on.* The screen may turn off shortly after you release the wake lock, or it may* not if there are other wake locks still held.* </p>** @param flags Combination of flag values to modify the release behavior.* Currently only {@link #RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY} is supported. * Passing 0 is equivalent to calling {@link #release()}.*/public void release(int flags) {synchronized (mToken) {if (!mRefCounted || --mCount == 0) { //,满⾜任意条件即可执⾏mHandler.removeCallbacks(mReleaser);if (mHeld) { //满⾜条件,才能执⾏mService.releaseWakeLockTrace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);try {mService.releaseWakeLock(mToken, flags);} catch (RemoteException e) {}mHeld = false;}}if (mCount < 0) { //抛出异常throw new RuntimeException("WakeLock under-locked " + mTag);}}}......}View Code。

wakelock用法

wakelock用法

wakelock用法Wakelock是Android开发中非常重要的一个概念,它允许应用程序保持设备处于唤醒状态,以便执行任务或运行服务,而不会受到设备休眠的干扰。

Wakelock的原理是在应用程序需要保持设备唤醒状态时,获得设备CPU的锁,防止CPU进入睡眠模式,从而保证应用程序可以继续执行任务或运行服务。

但是,Wakelock在使用时也会导致设备耗电量增加,因此应该在必要的情况下谨慎使用。

使用Wakelock需要了解以下几个方面:1. 获取Wakelock:可以通过PowerManager的acquire方法获取一个Wakelock实例。

在获取Wakelock实例时,可以传递不同参数来控制设备的唤醒方式,例如PARTIAL_WAKE_LOCK表示设备只保持CPU唤醒,而屏幕和键盘灯会关闭;FULL_WAKE_LOCK表示设备保持CPU、屏幕和键盘灯均保持唤醒。

2. 释放Wakelock:在使用完Wakelock后,需要通过Wakelock的release方法来释放锁,以允许设备进入休眠状态。

如果不释放Wakelock,则可能会导致设备的电量快速消耗。

为了确保Wakelock被正确释放,建议将其放置在finally块中。

3. 使用场景:Wakelock适用于需要长时间执行任务或运行服务的场景,例如下载长时间需要的文件、播放音乐、持续运行后台服务等。

在使用Wakelock时,需要选择合适的锁类型和释放时机,以避免不必要的电量消耗和资源浪费。

4. Wakelock的注意事项:由于Wakelock会导致设备耗电量增加,因此在使用Wakelock时需谨慎,建议在必要的情况下使用。

此外,在获取Wakelock实例时应使用Context.getSystemService(Context.POWER_SERVICE)来获取PowerManager实例,避免内存泄漏问题。

android5.1 PowerManagerService和DisplayPowerControler、DisplayPowerState关系

android5.1 PowerManagerService和DisplayPowerControler、DisplayPowerState关系

android5.1 PowerManagerService和DisplayPowerControler、DisplayPowerState关系PowerManagerService在updateDisplayPowerStateLocked中与DisplayPowerControler交互,详细看代码:[java] view plain copyprivate boolean updateDisplayPowerStateLocked(int dirty) {final boolean oldDisplayReady = mDisplayReady;if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_W AKEFULNESS| DIRTY_ACTUAL_DISPLAY_POWER_STA TE_UPDA TED | DIRTY_BOOT_COMPLETED| DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST)) != 0) { mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked();// Determine appropriate screen brightness and auto-brightness adjustments.int screenBrightness = mScreenBrightnessSettingDefault;float screenAutoBrightnessAdjustment = 0.0f;boolean autoBrightness = (mScreenBrightnessModeSetting ==Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) {screenBrightness = mScreenBrightnessOverrideFromWindowManager;autoBrightness = false;} else if (isValidBrightness(mTemporaryScreenBrightnessSettingOverride)) {screenBrightness = mTemporaryScreenBrightnessSettingOverride;} else if (isValidBrightness(mScreenBrightnessSetting)) {screenBrightness = mScreenBrightnessSetting;}if (autoBrightness) {screenBrightness = mScreenBrightnessSettingDefault;if (isValidAutoBrightnessAdjustment(mTemporaryScreenAutoBrightnessAdjustmentSettingOverride)) {screenAutoBrightnessAdjustment =mTemporaryScreenAutoBrightnessAdjustmentSettingOverride;} else if (isValidAutoBrightnessAdjustment(mScreenAutoBrightnessAdjustmentSetting)) {screenAutoBrightnessAdjustment = mScreenAutoBrightnessAdjustmentSetting;}}screenBrightness = Math.max(Math.min(screenBrightness,mScreenBrightnessSettingMaximum), mScreenBrightnessSettingMinimum);screenAutoBrightnessAdjustment = Math.max(Math.min(screenAutoBrightnessAdjustment, 1.0f), -1.0f);// Update display power request.mDisplayPowerRequest.screenBrightness = screenBrightness;mDisplayPowerRequest.screenAutoBrightnessAdjustment =screenAutoBrightnessAdjustment;eAutoBrightness = autoBrightness;eProximitySensor = shouldUseProximitySensorLocked();mDisplayPowerRequest.lowPowerMode = mLowPowerModeEnabled;mDisplayPowerRequest.boostScreenBrightness = mScreenBrightnessBoostInProgress;if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) { mDisplayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager;mDisplayPowerRequest.dozeScreenBrightness =mDozeScreenBrightnessOverrideFromDreamManager;} else {mDisplayPowerRequest.dozeScreenState = Display.STATE_UNKNOWN;mDisplayPowerRequest.dozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;}mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,//调用DisplayPowerControler的requestPowerstate接口mRequestWaitForNegativeProximity);mRequestWaitForNegativeProximity = false;}return mDisplayReady && !oldDisplayReady;}接下来我们再看看mDisplayManagerInternal这个成员变量:在systemready中[java] view plain copymDisplayManagerInternal = getLocalService(DisplayManagerInternal.class);。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

android PowerManager(电源管理)wakelock(屏幕锁)
今天在看一个项目的源代码时,发现了这个电源管理和屏幕锁:PowerManager、wakelock。

其中在onStart()方法中获取wakelock,并且在onstop()中将这个lock释放掉。

protected v oid onStart() {
....
pm = (PowerManager) getSy stemServ ice(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP, "MediaCenterApplication");
wl.acquire();
wl.setRef erenceCounted(f alse);
....
}
protected v oid onStop() {
....
wl.release();
....
}
PowerManager和WakeLock的操作步骤
1. PowerManager pm = (PowerManager) getSy stemServ ice(Context.POWER_SERVICE);通
过Context.getSystemService().方法获取PowerManager实例。

2. 然后通过PowerManager的newWakeLock
((int flags, String
tag)来生成WakeLock实例。

int Flags指示要获取哪种WakeLock,不同的Lock对cpu 、屏幕、键盘灯有不同影响。

3. 获取WakeLock实例后通过acquire()获取相应的锁,然后进行其他业务逻辑的操作,最后使用release()释放(释放是必须的)。

关于int flags
各种锁的类型对CPU 、屏幕、键盘的影响:
PA RTI A L_W A KE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。

SCREEN_DIM_W A KE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯
SCREEN_BRIGHT_W A KE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯
FULL_WA KE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
A C QUIRE_C A USES_W AKEUP:Normal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. f rom user activ ity). This f lag will f orce the screen and/or key board to turn on immediately, when the WakeLock is acquired. A ty pical use would be f or notifications which are important f or the user to see immediately.
ON_AFTER_RE LE ASE:f this flag i s set, the user activity timer w ill be reset w hen the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker i f you are cycling between wake lock conditions.
权限获取
要进行电源的操作需要在AndroidManif est.xml中声明该应用有设置电源管理的权限。

<uses-permission android:name="android.permission.WAKE_LOCK"/> 你可能还需要 <uses-permission
android:name="android.permission.DEVICE_POWER"/>。

相关文档
最新文档