Android 程序在锁屏下仍然工作的方法

来源:互联网 发布:苹果6禁止通讯网络 编辑:程序博客网 时间:2024/06/07 02:01

今天有人问我,怎么实现锁屏也能监听音量键。我就和他说,把你要做的事情抽取出来放到service后台里,然后再设置service为保持唤醒。但是看到他还是比较迷惘,而且保持唤醒属于电源管理这块,可能也有些朋友不是很懂,这里我稍稍讲解一下。

一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使系统进入休眠状态,这时,Android系统中CPU会保持在一个相对较低的功耗状态。这样子就会使得应用程序很多操作,例如轮询,在锁屏后就无法工作了。这时候我们就要使用android的wakelock机制了。

wakelock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠,可以被用户态程序和内核获得。这个锁可以是有超时的或者是没有超时的,超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了,内核就会启动休眠机制来进入休眠。
使用WakeLock时我们首先要在app的Manifest.xml里取得它的权限:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DEVICE_POWER"/>

下面我们看下代码:
    WakeLock wakeLock = null;      private void acquire()      {          if (null == wakeLock)          {              PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);              wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "MyService");              if (null != wakeLock)              {                  wakeLock.acquire();              }          }      }            private void release()      {          if (null != wakeLock)          {              wakeLock.release();              wakeLock = null;          }      }  
wakeLock作为电源管理powerManager的一部分,我们先看看官方的说明:

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.

我们使用wakeLock时需取得powermanager的对象,然后再去取得wakelock对象,其中newWakeLock()方法有两个参数,第二个是字符串,是你要使用WakeLock的service或其他的名称。第一个参数是锁的类型,不同的类型的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:当锁被释放时,保持屏幕亮起一段时间。

如此一来,我们的程序就能继续在锁屏下进行各种监听、轮询等等。


欢迎加关注联系,相互学习。

如有转载,请注明出处:http://blog.csdn.net/hjhrq1991


0 0
原创粉丝点击