在 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 操作系统是不是会释放唤醒锁?

Android 唤醒锁问题

在 android 应用程序中访问唤醒锁统计信息

每次使用标签创建新的 android 唤醒锁都会返回相同的唤醒锁吗?

部分唤醒锁不适用于 android wear

Webview行为唤醒锁android