安卓唤醒锁定(WakeLock)

6

我在获取WakeLock时遇到了问题,似乎无法正常工作。 我正在尝试获取FULL_WAKE_LOCK,但显示器没有启用,我的应用程序也无法执行任务。

我正在使用以下权限:android.permission.WAKE_LOCK

我的获取代码如下:

PowerManager pm = (PowerManager) getBaseContext().getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag");
wl.acquire();

我做错了什么?

编辑:添加了另一个标志ACQUIRE_CAUSES_WAKEUP...但行为没有改变

编辑2:我想做的就是播放音乐,并在特定事件后唤醒我的设备。音乐正常工作,但设备保持黑屏。

3个回答

7

WakeLock是保持屏幕常亮的一种低效方法。而使用WindowManager会更加方便。以下一行代码就可以取代WakeLock,需要WakeLock权限才能正常工作。同时,这种代码比WakeLock更高效。

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

您无需手动释放WakeLock。此代码将允许Android系统自动处理锁定。当您的应用程序在前台时,WakeLock保持,否则Android系统会自动释放锁定。

但是,如果您确实想要释放标志,可以使用以下方法:

getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

在我的测试中,只有在活动的onCreate方法中调用它才有效。例如,如果你在onCreate中添加了FLAG_KEEP_SCREEN_ON,然后尝试稍后将其移除,效果就不会生效,反之亦然。在ICS 4.0.3上进行了测试。 - Ben Clayton
您可以在任何地方使用它。您需要使用上下文进行翻译。 - Anoop Chandrika HarisudhanNair

3
private static PowerManager.WakeLock lockStatic = null;
private static String LOCK_NAME_STATIC = "MyWakeLock";

public static void acquireStaticLock(Context context) {
    getLock(context).acquire();
}

synchronized private static PowerManager.WakeLock getLock(Context context) {
    if (lockStatic == null) {
        PowerManager mgr = (PowerManager) context
                .getSystemService(Context.POWER_SERVICE);
        lockStatic = mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK,
                LOCK_NAME_STATIC);
        lockStatic.setReferenceCounted(true);
    }

    return (lockStatic);
}

用法:

在需要获取锁定时调用 acquireStaticLock()

在活动中需要释放锁定时,请调用 getLock(this).release();

还需要在清单文件中添加权限:

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

1
你需要定义LOCK_NAME_STATIC才能使用上面的代码。例如:private static String LOCK_NAME_STATIC = "MyWakeLock"; - Ben Clayton

1
你是在哪里获取唤醒锁定的?你需要在接收意图的接收器中获取它,而不是在启动意图的服务/活动中获取。

我正在一个活动中获取它,因为我已经将一个活动设置为接收器。 - Coxer
我不确定我理解了。BroadcastReceiver是一个抽象类而不是接口(Java中没有多重继承),因此Activity不能是BroadcastReceiver。你的意思是指在活动类中有一个私有静态BroadcastReceiver吗?我想说的是,在BroadcastReceiver的onReceive()方法中必须获取唤醒锁,而不是在服务启动的Activity的onCreate()方法中获取。 - Nic Strong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接