5

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

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(); 
    } 
} 

回答

5

你是不是失踪的onDestroy行

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

()?它是onCreate()中的一个局部变量,但它并没有在onDestroy()中声明。或者,更可能的是,您可能希望使其成为WakeLockService类的一个字段而不是局部变量。

9

那么,即使你会使用一个实例变量,我认为这不是做到这一点的方法。 谁来电destroy()?我希望不是你,这是OS的工作。 但是,当您持有唤醒锁时,您的destroy()方法被调用的可能性非常小,因为操作系统将首先销毁其他活动/服务。

除此之外,获取onCreate()方法中的唤醒锁还为时过晚。在到达onCreate()之前,当您通过闹铃或背景中的活动触发服务时,手机可能已经进入睡眠状态。

很难说你应该改变什么,因为你没有给出很多背景。 通常的事件过程就是这样。 A BroadcastReceiver被调用,并在onReceive()中获得唤醒锁并将其放入服务的静态变量中。服务完成后,它应该调用stopSelf(),释放唤醒锁,然后清空保留对锁的引用的静态变量。另外,如果使用服务,完全唤醒锁定很可能不是您想要的,但是部分唤醒锁定是。你不需要屏幕继续,对吧?

对不起,但是由于上面描述的问题,唤醒锁确实很复杂。这绝对是一个高级话题,容易搞砸。如果你这样做,你的应用会得到非常难看的评论,因为持续太久是一个主要的攻击,因为它耗尽了电池。 请不要采取这种错误的方式,但考虑到你在这里发布的问题的性质(语法/编译器错误),我强烈建议搜索没有服务和唤醒锁定的解决方案。

+0

感谢您的评论。在我正在使用的应用程序中,我需要手机处于100%唤醒模式,因此我使用了完整的唤醒锁。 – Tom 2009-06-15 11:42:14

+0

部分唤醒锁应足以启动CPU并使用网络。 – Eno 2010-07-01 05:20:06

+0

也谢谢我。你的解释是简洁的,并且比问题和答案更有帮助:) – Melllvar 2010-10-05 07:54:05