• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Android锁屏状况下保持背景唤醒WakeLock机制

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0606/529.html

 

少许手机app(如微信、QQ等)有新消息来到达,手机屏幕即使在锁屏状况下也会亮起,并提示用户有新消息。不过,普通环境动手机锁屏后,Android系统为了省电以及削减CPU花消,在一段光阴后会使系统进入休眠状况,这时,Android系统中CPU会保持在一个相对较低的功耗状况,而收到新消息必定有网页要求,而网页要求是花消CPU的操纵,辣么若何在锁屏状况甚至系统进入休眠后,仍旧保持系统的网页状况以及通过程序唤醒手机呢?答案即是Android中的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.

 

 

 

Android 系统支撑运用程序及服无在待机前留存程序运行状况,如待机前关闭文件读写、usb 操纵、停息音乐播放;也支撑唤醒后的程序状况恢复,如恢复翻开文件举行读写操纵,恢复 usb 操纵、恢复音乐播放等。这些状况的留存和恢复功效可以包管系统在待机唤醒后能平常事情。

 

要紧供应两种方式:

 

1、待机播送消息和唤醒播送消息。

2、Wakelock 锁机制。

   

分为两个片面申明一下:

 

1、android 系统待机处分机制

 

待机播送消息和唤醒播送消息

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

 

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);

}

 

这里顺带申明一下播送汲取的优先级问题:

汲取者按照在 Manifest.xml 文件中设置的汲取挨次顺次汲取Intent,挨次实行的,汲取的优先级可以在系统配置文件中设置:

申明在intent-filter元素的android:priority 属性中,数值越大优先级别越高,其取值局限为-1000到1000。固然也能够在挪用IntentFilter工具的setPriority()要领举行设置

 

Wakelock 锁机制:

运用程序可以通过要求 wakelock 锁的机制来对系统是否待机作出投票,当有任何一个运用要求了 wakelock 锁,待机时没有开释掉,系统是不会进入待机的,直到全部运用的 wakelock 锁都开释掉了,才会进入待机。

 

2、运用程序运用要领:

 

实例代码:

 

 

[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必然必要留意下!

 

 


上篇:上一篇:Android中判断当前是debug还是release
下篇:下一篇:Android service后台实行按时使命