【问题标题】:Android service seems to be getting paused when screen is off屏幕关闭时,Android 服务似乎正在暂停
【发布时间】:2014-06-16 00:10:56
【问题描述】:

我有一个 android 服务,它每 5 分钟从服务器拉取更新。屏幕打开时效果很好,但关闭时似乎会暂停。请记住,服务使用 start foreground() 在前台运行。

我目前正在创建一个新线程并让它休眠,以便每 5 分钟运行一次更新,有没有更好的方法可以让计时器在设备休眠时仍然运行?

【问题讨论】:

  • “我目前正在创建一个新线程并让它休眠,以便每 5 分钟运行一次更新”——请不要为了看时钟而浪费用户的系统 RAM。 “有没有更好的方法可以让计时器在设备睡眠时仍然运行?” -- 请使用AlarmManager,以及WakefulBroadcastReceiverWakefulIntentService 模式。

标签: java android android-service thread-sleep


【解决方案1】:

通过 AlarmManager 使用警报。警报将唤醒 CPU,让您进行处理。如果您只是在线程中等待睡眠,则如果手机处于关机状态(处于睡眠模式),您将不会被唤醒。

当然,您需要一个后台线程或任务来进行实际下载。这就是唤醒锁的作用。当闹钟响起时,请求唤醒锁。完成检查/下载后,释放它。对于您的情况,您可以保持相同的架构 - 只需等待 5 分钟的睡眠等待重新检查,而是等待信号量。当警报响起时,请求唤醒锁并向信号量发出信号。检查完成后,释放唤醒锁和信号量,然后再次等待。

【讨论】:

  • 谢谢!我能够在没有信号量的情况下完成它。我读了一些关于它们的内容,但我仍然不确定它会起到什么作用。你能澄清一下吗?
  • 如果你有一个线程想要等待一个事件,你就在一个信号量上等待。然后看到事件的代码部分释放信号量。这将唤醒另一个线程并允许它运行。这样代码只能在事件发生后运行。当然还有其他方法可以做到这一点,它只是一种常见且有效的方法。
【解决方案2】:

没有进行更新,因为当您关闭屏幕时手机将进入睡眠状态。如果打开“优化 WiFi”模式,在 WiFi 上会更频繁地发生。

你应该看看wakelocks。获取唤醒锁以防止设备入睡。释放它让它再次入睡。请注意,这显然会增加电池消耗。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多