Android之唤醒锁定

唤醒锁定简称唤醒锁
它可以让CPU持续处于唤醒状态,CPU无法进入休眠。
该机制比较耗电,但是在一些场景上必须用到,比如:MP3在后台播放,即使屏幕长时间熄灭也需要播放。
Android的唤醒锁接口为:PowerManager.WakeLock

(1)基本使用

    // 创建电源管理类
    PowerManager manager = (PowerManager) getSystemService(Service.POWER_SERVICE);
    // 创建唤醒锁
    PowerManager.WakeLock wakeLock =  manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AA");
    // 获得唤醒锁
    wakeLock.acquire();

当需要释放唤醒锁时,应该即使释放,防止耗电增加

    // 释放锁
    wakeLock.release();

(2)锁超时机制

public void acquire(long timeout)

申请锁时,尽量设置超时时间,防止锁一直无法释放。

(3)权限

申请唤醒锁时,必须添加唤醒锁权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

(4)唤醒锁级别

在创建唤醒锁时,需要传入levelAndFlags

public WakeLock newWakeLock(int levelAndFlags, String tag)

levelAndFlags的选择有:

PowerManager.PARTIAL_WAKE_LOCK:

    唤醒锁级别:确保CPU正在运行;屏幕和键盘 背光熄灭。 
    如果用户按下电源按钮,那么屏幕将会被关闭,但是CPU将一直保持着,直到所有唤醒锁被释放。

PowerManager.SCREEN_DIM_WAKE_LOCK:

    已废弃,不管它。

PowerManager.SCREEN_BRIGHT_WAKE_LOCK:

    已废弃,不管它。

PowerManager.FULL_WAKE_LOCK:

    已废弃,不管它。

PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK:

    唤醒锁定级别:当接近传感器激活时,关闭屏幕。 
    如果接近传感器检测到附近有物体,屏幕将立即关闭,但CPU会保持唤醒。在物体移动后不久,屏幕再次打开。

PowerManager.DOZE_WAKE_LOCK:

    唤醒锁级别:使屏幕处于低功耗状态,如果没有其它锁,那么允许CPU暂停。
    它已被{}标识,不对外开放。

PowerManager.DRAW_WAKE_LOCK:

    唤醒锁级别:保持设备足够清醒,以便进行绘制。 
    它已被{}标识,不对外开放。

(5)是否保持唤醒锁

public boolean isHeld()

如果已经持有唤醒锁,但是没有释放,那么返回true,否则返回false;

(6)设置与唤醒锁关联的工作源

public void setWorkSource(WorkSource ws) 

工作源用于确定唤醒锁代表哪个应用程序。
这在服务代表应用程序执行工作的情况下很有用,以便该工作的成本可以计入应用程序。 
确保在使用工作源时遵循标记命名约定,使应用程序开发人员更容易理解属于他们的唤醒锁。

(7)释放带有标志的唤醒锁

public void release(int flags)

释放带有标志的唤醒锁,以修改释放行为。 此方法将释放您对正在打开的cpu或屏幕的声明。
屏幕可能会在你释放尾锁后不久关闭,如果还有其他锁,屏幕可能不会关闭。

使用标志值的组合来修改释放唤醒锁的行为,但是当前只支持RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY。

(8)唤醒锁的计数机制

public void setReferenceCounted(boolean value)

默认情况下,唤醒锁是计数的。
如果唤醒锁计数,那么wakeLock.acquire()的调用数量要和wakeLock.release()的调用数量相同;
如果唤醒锁不计数,那么主要调用一次wakeLock.release()就可以释放所有的唤醒锁了;

所以,为了保证唤醒锁完全释放,可以设置为不计数模式

    wakeLock.setReferenceCounted(false);
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio中,实现应用在屏幕关闭(熄屏)状态下接收消息并唤醒屏幕的功能,通常涉及到后台服务(Service)和广播接收器(BroadcastReceiver)。这里是一个简单的步骤概述: 1. **创建广播接收器**: - 在`Manifest.xml`文件中声明一个`<receiver>`元素,用于接收系统发出的唤醒屏幕的意图(如ACTION_SCREEN_ON)。 ```xml <receiver android:name=".WakeUpReceiver"> <intent-filter> <action android:name="android.intent.action.SCREEN_ON" /> </intent-filter> </receiver> ``` 2. **定义广播接收器**: - 创建一个新的Java或Kotlin类,继承自`BroadcastReceiver`,并在其中处理接收到的意图。 ```java public class WakeUpReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { // 在此处执行唤醒操作,比如发送一条消息到UI线程更新内容 Intent serviceIntent = new Intent(context, MyService.class); context.startService(serviceIntent); } } } ``` 3. **启动后台服务**: - 创建一个后台服务,比如`MyService`,该服务可以在接收到意图后处理实际的消息任务。 - 在`onCreate()`方法中,设置服务为可见,并开始监听消息。 4. **发送消息**: - 当需要向用户显示消息时,在前台Activity或其他地方调用`startService()`,传递广播接收器中的意图。 5. **注意权限**: - 需要在`AndroidManifest.xml`中添加对应权限,例如`<uses-permission android:name="android.permission.WAKE_LOCK"`,以获取设备的屏幕锁定权限。 6. **测试**: - 启动应用,确保在熄屏状态,发送消息,然后观察是否能成功唤醒屏幕并展示消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值