WakeLock保持后台唤醒状态

官方对于WakeLock的解释:
    PowerManager:This class gives you control of the power state of the device.
    PowerManager.WakeLock: lets you say that you need to have the device on.
java

 

Android 系统支持应用程序及服务在待机前保存程序运行状态,如待机前关闭文件读写、usb 操做、暂停音乐播放;也支持唤醒后的程序状态恢复,如恢复打开文件进行读写操做,恢复 usb 操做、恢复音乐播放等。这些状态的保存和恢复功能能够保证系统在待机唤醒后能正常工做。android

主要提供两种方式:app

一、待机广播消息和唤醒广播消息。
二、Wakelock 锁机制。
   
分为两个部分说明一下:
ui

一、android 系统待机处理机制spa

待机广播消息和唤醒广播消息
系统在 PowerManagerService 类中注册了 2 个广播分别用于待机前和唤醒后发送。
orm

void initInThread(){
//唤醒后:
mScreenOnIntent=newIntent(Intent.ACTION_SCREEN_ON);//唤醒后发送
mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
//待机前:
mScreenOffIntent=newIntent(Intent.ACTION_SCREEN_OFF);//待机时发送
mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
}
xml

这里顺带说明一下广播接收的优先级问题:
接收者按照在 Manifest.xml 文件中设置的接收顺序依次接收Intent,顺序执行的,接收的优先级能够在系统配置文件中设置:
声明在intent-filter元素的android:priority 属性中,数值越大优先级别越高,其取值范围为-1000到1000。固然也能够在调用IntentFilter对象的setPriority()方法进行设置
对象

Wakelock 锁机制:
应用程序能够经过申请 wakelock 锁的机制来对系统是否待机做出投票,当有任何一个应用申请了 wakelock 锁,待机时没有释放掉,系统是不会进入待机的,直到全部应用的 wakelock 锁都释放掉了,才会进入待机。
get

二、应用程序使用方法:it

实例代码:


[java] view plaincopyprint?
<SPAN style="FONT-FAMILY: SimSun">  private WakeLock wakeLock = null; 
 
    /**
     * 获取电源锁,保持该服务在屏幕熄灭时仍然获取CPU时,保持运行
     */ 
    private void acquireWakeLock() { 
        if (null == wakeLock) { 
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK 
                    | PowerManager.ON_AFTER_RELEASE, getClass() 
                    .getCanonicalName()); 
            if (null != wakeLock) { 
                Log.i(TAG, "call acquireWakeLock"); 
                wakeLock.acquire(); 
            } 
        } 
    } 
 
    // 释放设备电源锁  
    private void releaseWakeLock() { 
        if (null != wakeLock && wakeLock.isHeld()) { 
            Log.i(TAG, "call releaseWakeLock"); 
            wakeLock.release(); 
            wakeLock = null; 
        } 
    }</SPAN> 

 private WakeLock wakeLock = null;

 /**
  * 获取电源锁,保持该服务在屏幕熄灭时仍然获取CPU时,保持运行
  */
 private void acquireWakeLock() {
  if (null == wakeLock) {
   PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
   wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
     | PowerManager.ON_AFTER_RELEASE, getClass()
     .getCanonicalName());
   if (null != wakeLock) {
    Log.i(TAG, "call acquireWakeLock");
    wakeLock.acquire();
   }
  }
 }

 // 释放设备电源锁
 private void releaseWakeLock() {
  if (null != wakeLock && wakeLock.isHeld()) {
   Log.i(TAG, "call releaseWakeLock");
   wakeLock.release();
   wakeLock = null;
  }
 }
WakeLock 类型以及说明:

    PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有多是关闭的。
    SCREEN_DIM_WAKE_LOCK:保持CPU 运转,容许保持屏幕显示但有多是灰的,容许关闭键盘灯
    SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,容许保持屏幕高亮显示,容许关闭键盘灯
    FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度
    ACQUIRE_CAUSES_WAKEUP:强制使屏幕亮起,这种锁主要针对一些必须通知用户的操做.
    ON_AFTER_RELEASE:当锁被释放时,保持屏幕亮起一段时间


最后 AndroidManifest.xml 声明权限:
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.DEVICE_POWER"/>


应用程序中若是要在待机前保存数据状态的话,要保证此过程当中不会进入待机。能够在 onResume() 或者 onStart() 中申请 wakelock 锁,即调用acquireWakeLock()方法。

在 onPause() 或者 onDistroy() 中处理应用待机后再释放掉 wakelock 锁,此时调用releaseWakeLock()方法

 


最后一点须要注意下:

另外WakeLock的设置是 Activiy 级别的,不是针对整个Application应用的。因此application下有多个activity必定须要注意下!

附上一段手机开机启动log分析:

相关文章
相关标签/搜索