Android如何实现后台唤醒(磨砺营马剑威Android)

て烟熏妆下的殇ゞ 提交于 2019-12-05 13:04:33
一些手机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、应用程序使用方法:

/** 
 * 获取电源锁,保持该服务在屏幕熄灭时仍然获取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一定需要注意下!
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!