在 Android 1.5 服务中使用唤醒锁
Posted
技术标签:
【中文标题】在 Android 1.5 服务中使用唤醒锁【英文标题】:Using a wakelock in a service Android 1.5 【发布时间】:2010-11-02 19:29:59 【问题描述】:您好,我正在尝试使用服务来控制唤醒锁,以便在我的应用程序运行时永久保持屏幕开启。我创建唤醒锁并在 onCreate() 中激活它并在 onDestroy() 中释放它,但是我收到错误“wl cannot be resolved”。有人可以解释我如何克服这个问题吗?代码如下:
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();
【问题讨论】:
【参考方案1】:好吧,即使您会使用实例变量,我也认为这不是这样做的方法。
谁会打电话给destroy()
?我希望不是你,这是操作系统的工作。
但是,当您持有唤醒锁时,您的 destroy()
方法极不可能被调用,因为操作系统会首先破坏其他活动/服务。
除此之外,在onCreate()
方法中获取唤醒锁为时已晚。在到达onCreate()
之前,当您从警报触发服务而不是从后台活动触发服务时,手机可能已经进入睡眠状态。
由于您没有提供太多背景信息,因此很难说您应该做出什么不同。
通常的事件过程是这样的。
BroadcastReceiver
被调用并在 onReceive()
中获取唤醒锁并将其放入服务的静态变量中。服务完成后,它应该调用stopSelf()
,释放唤醒锁,然后将保持对锁的引用的静态变量清空。
此外,如果您使用服务,则很可能不是您想要的完全唤醒锁,而是部分唤醒锁。你不需要屏幕一直亮着,对吧?
抱歉,由于我上面描述的问题,唤醒锁的使用确实很复杂。这绝对是一个高级主题,很容易搞砸。如果你这样做了,你的应用程序会变得非常丑陋,因为坚持太久会耗尽电池电量。 请不要采取错误的方式,但鉴于您在此处发布的问题的性质(语法/编译器错误),我强烈建议您搜索没有服务和唤醒锁的解决方案。
【讨论】:
感谢您的评论。在我正在开发的应用程序中,我需要手机处于 100% 唤醒模式,因此我使用了完全唤醒锁。 部分唤醒锁应该足以启动 CPU 并使用网络。 也感谢我。你的解释很简洁,比问题和答案的结合更有帮助:) 谢谢。 android 开发者页面没有像你那样解释唤醒锁【参考方案2】:你是不是错过了这条线
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
在 onDestroy() 中?它是onCreate()中的一个局部变量,但它根本没有在onDestroy()中声明。
或者,更有可能的是,您可能希望将其设为 WakeLockService 类的字段,而不是局部变量。
【讨论】:
以上是关于在 Android 1.5 服务中使用唤醒锁的主要内容,如果未能解决你的问题,请参考以下文章
如果持有它的应用程序或服务被杀死,Android 操作系统是不是会释放唤醒锁?