6

您好我正在尝试使用服务来控制唤醒锁,以便在我的应用程序运行时永久保持屏幕开启。我创建了唤醒锁并在 onCreate() 中激活它并在 onDestroy() 中释放它,但是我收到错误“wl 无法解决”。有人可以解释我如何克服这个问题吗?下面的代码:

public class WakeLockService extends Service {

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }  
    @Override
    public void onCreate() {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
        wl.acquire();
    }
    @Override
    public void onDestroy() {
        wl.release();
    }
}
4

2 回答 2

9

好吧,即使您使用实例变量,我也认为这不是这样做的方法。谁会打电话destroy()?我希望不是你,这是操作系统的工作。但是当您持有唤醒锁时,您的destroy()方法极不可能被调用,因为操作系统将首先破坏其他活动/服务。

除此之外,在onCreate()方法中获取唤醒锁为时已晚。在onCreate()到达之前,当您从警报触发服务而不是从后台活动触发服务时,手机可能已经进入睡眠状态。

由于您没有提供太多背景信息,因此很难说您应该做出什么不同。通常的事件过程是这样的。ABroadcastReceiver被调用并在onReceive()您获取唤醒锁并将其放在您的服务上的静态变量中。服务完成后,它应该调用stopSelf(),释放唤醒锁,然后将保持对锁的引用的静态变量为空。

此外,如果您使用服务,则很可能不是您想要的完全唤醒锁,而是部分唤醒锁。你不需要屏幕一直亮着,对吧?

抱歉,由于我上面描述的问题,唤醒锁的使用确实很复杂。这绝对是一个高级主题,很容易搞砸。如果你这样做了,你的应用程序会得到非常难看的评论,因为坚持太久是一种严重的冒犯,因为它会耗尽电池。请不要采取错误的方式,但是鉴于您在此处发布的问题的性质(语法/编译器错误),我强烈建议您寻找没有服务和唤醒锁的解决方案。

于 2009-06-15T11:36:10.047 回答
6

你是不是错过了这条线

    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");

在 onDestroy() 中?它是 onCreate() 中的局部变量,但根本没有在 onDestroy() 中声明。

或者,更有可能的是,您可能希望将其设为 WakeLockService 类的字段而不是局部变量。

于 2009-06-14T10:03:50.813 回答