服务,唤醒锁定

17

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

我开发了一个小应用程序,在其中使用后台Service,当用户摇动手机时,它会一直播放音乐。我测试过设备锁定且屏幕关闭后,它可以按预期工作。

  1. 我从该论坛上听说,服务可能会在设备进入睡眠模式时立即关闭。这是真的吗?在我的情况下,它总是能够工作,我是否遗漏了什么?

  2. WakefulIntentService的必要性是什么?什么时候需要使用WakefulIntentService

  3. 我尝试在Service中运行计时器,虽然设备被锁定且屏幕关闭,但我可以很确定我的计时器正在运行,因为每次计时器触发时我都会收到通知。

2个回答

19

听论坛上的意见,设备进入睡眠状态后,该服务可能会立即关闭。这是真的吗?

是的。

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

那么您设备上的其他应用程序可能正在阻止设备进入睡眠状态。建议使用adb shell dumpsys power命令查看哪些WakeLocks未释放。

需要使用WakeFulIntent服务吗?何时需要使用WakefulIntentService?

如果用户长时间不活动且没有操作使设备保持唤醒状态,则设备可能会进入睡眠状态。为了确保设备始终保持唤醒状态,可以使用WakeLock。对于类似下载文件的事务性任务,WakefulIntentServiceIntentService和一个WakeLock结合起来,使设备保持唤醒状态变得相对容易(并且只需尽可能短的唤醒时间)。

WakefulIntentService不适用于需要无限运行(例如音乐播放器)的服务。对于这些服务,您需要管理自己的WakeLock


我在我的服务中生成一个线程,以保持我的计时器始终运行。我在线程的run方法中安排了计时器?这是否是计时器在设备锁定时仍然存在的原因。我在两个不同的设备上进行了测试,结果很好。据我所知,IntentService一旦执行完成就会被杀死。我想要一个进程永久在后台运行,以便监听用户活动,每当用户摇动手机时,我需要根据标准向用户发出警报。我相信,一旦我锁定设备并关闭屏幕,设备就会进入睡眠模式。 - Ramesh Sangili
1
@Ramesh:“我想要一个进程一直在后台运行,监听用户的活动。每当用户摇晃手机时,我需要根据特定标准提醒用户。”-- 这将需要您不断地获取WakeLock,从而对用户的电池寿命造成相应的损害。您的用户会在Play商店上给您低评分的。 - CommonsWare
1
抱歉打扰您,Gmail、Facebook和LinkedIn是如何每隔x分钟同步邮件或自动更新的?它们是否也使用WakeLock?或者我们是否有其他更有效的方法来永久运行进程? - Ramesh Sangili
@Ramesh:“Gmail,Facebook和LinkedIn如何每隔x分钟同步邮件或自动更新?”——有些人可能使用带有“AlarmManager”的服务,有些人可能实现了“SyncAdapter”。“他们是否也使用WakeLock?”——当然服务端会使用。我还没有尝试过“SyncAdapter”,但我的希望是在这种情况下Android可以为您管理“WakeLock”。 - CommonsWare

11

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

确保你的服务是"粘性"的:

@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" />

8
你建议在服务的哪些功能中放置“acquire”和“release”调用?如果服务是IntentService会怎么样? - android developer
在onCreate()中获取,在onDestroy()中释放。 - Ritzor
FULL_WAKE_LOCK 在 API 等级 17 中已被弃用。 - Tamim Attafi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接