【问题标题】:Service, WakeLock服务,唤醒锁
【发布时间】:2013-01-02 19:42:10
【问题描述】:

在查看 Stackoverflow 中关于 WakefulIntentService 的问题和答案后,我有点困惑。我只是想了解一些关于这个主题的知识,以确保我的理解是正确的,如果我错了,请随时纠正我。

我构建了一个小型应用程序,我在其中使用背景Service,只要用户摇动手机,它就会一直播放音乐。我在设备锁定并关闭屏幕后进行了测试,它可以按预期工作。

  1. 我从 this forum 那里听到的消息,该服务可能会在设备进入睡眠状态后立即关闭。真的吗?就我而言,它总是有效,我错过了什么吗?

  2. WakeFulIntentService 需要什么?我们什么时候需要使用WakefulIntentService

  3. 我尝试在Service 中运行计时器,但我可以肯定地说,设备已锁定并且屏幕已关闭,而且我的计时器正在运行。因为我以前每次计时器跳闸时都会收到通知。

【问题讨论】:

    标签: android service wakelock


    【解决方案1】:

    我从这个论坛听到的消息是,一旦设备进入睡眠状态,服务可能会关闭。这是真的吗?

    是的。

    在我的情况下,它总是有效的

    然后,您设备上的其他东西会阻止设备进入睡眠状态。或许可以使用 adb shell dumpsys power 来看看 WakeLocks 有哪些出色之处。

    WakeFulIntent 服务需要什么?我们什么时候需要使用 WakefulIntentService?

    如果用户处于非活动状态并且没有任何东西使设备保持唤醒状态,则设备可能会进入睡眠状态。 WakeLock 用于确保设备保持唤醒状态。对于事务类型的工作(例如,下载文件),WakefulIntentService 结合了 IntentServiceWakeLock 以使设备在必要时保持唤醒(并且仅在必要时保持 ) 相对容易。

    WakefulIntentService 不适合与需要无限期运行的服务一起使用,例如音乐播放器。对于这些,请管理您自己的WakeLock

    【讨论】:

    • 我正在我的服务中生成一个线程以保持我的计时器始终运行。我在线程的 run 方法中安排计时器?尽管设备被锁定,但这是否是计时器仍然存在的原因。我在两种不同的设备上进行了测试,效果很好。据我了解,一旦执行完成, IntentService 将被终止。我希望一个进程永远在后台运行以监听用户活动,每当用户摇动手机时,我需要根据标准提醒用户。我相信,一旦我锁定设备并且屏幕关闭,设备就会进入睡眠模式。
    • @Ramesh:“我希望一个进程永远在后台运行以监听用户活动,每当用户摇动手机时,我需要根据标准提醒用户”——将要求您不断获取WakeLock,对用户的电池寿命有相应的伤害。您的用户会在 Play 商店中以低评分奖励您。
    • 很抱歉打扰您,gmail、facebook、linkedin 如何每隔 x 分钟自动同步邮件或更新?他们也使用WakeLock吗?还是我们有其他东西可以有效地永久运行一个进程?
    • @Ramesh:“gmail、facebook、linkedin 如何每隔 x 分钟自动同步邮件或更新?” -- 有些可能使用AlarmManager 的服务,有些可能实现SyncAdapter。 “他们也使用WakeLock吗?” - 当然服务的人会。我还没有玩过SyncAdapter,但我希望Android 在那种情况下为你管理WakeLock
    【解决方案2】:

    我在一个应用程序中使用了下面的代码。

    确保您的服务具有粘性:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        //this service will run until we stop it
    
        return START_STICKY;
    }
    

    如果您希望您的手机始终处于唤醒状态,您可以使用以下代码:

    private WakeLock wl;
    
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "whatever");
        wl.acquire();
    

    不要忘记清单中的权限。

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

    【讨论】:

    • 您建议将“获取”和“释放”调用放在服务的哪些功能中?如果服务是 IntentService 怎么办?
    • 在 oncreate() 中获取并在 destroy() 中释放
    • FULL_WAKE_LOCK 在 API lvl 17 中已弃用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多