在Android 1.5服务中使用唤醒锁

时间:2009-06-14 09:23:23

标签: java android android-service android-wake-lock android-1.5-cupcake

您好我正在尝试使用服务来控制唤醒锁,因此我可以在应用程序运行时永久保持屏幕不亮。我创建唤醒锁并在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();
    }
}

2 个答案:

答案 0 :(得分:9)

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

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

很难说你应该做些什么,因为你没有提供太多的背景。 通常的事件是这样的。 调用BroadcastReceiver并在onReceive()中获取唤醒锁并将其放入服务的静态变量中。当服务完成后,它应该调用stopSelf(),释放唤醒锁,然后使保持对锁的引用的静态变量为空。

此外,如果您使用服务,则完全唤醒锁定很可能不是您想要的,但部分唤醒锁定是。你不需要让屏幕保持开启,对吧?

很抱歉,但是使用唤醒锁非常复杂,因为我上面描述的问题正是如此。这绝对是一个高级主题,很容易搞砸。如果你这样做,你的应用程序会得到非常难看的评论,因为持续时间过长是一个重大的冒犯,因为它耗尽了电池。 请不要采取错误的方式,但考虑到您在此处发布的问题的性质(语法/编译器错误),我强烈建议您在没有服务和唤醒锁定的情况下搜索解决方案。

答案 1 :(得分:5)

你是不是错过了这一行

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

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

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