【问题标题】:keep service alive in android在android中保持服务活着
【发布时间】:2011-07-28 10:20:51
【问题描述】:

我创建了一个 Android 服务,它基本上执行以下操作:

schedule a task, using the ScheduledThreadPoolExecutor.schedule() method
when the schedule time is reached, the task is executed and a new schedule is started

因此,服务持续有一个计时器(在任务执行期间除外);有时有 2 个(独立的)计时器,具体取决于任务的结果。该服务应该一直在运行,并且不时执行不同的任务。

似乎一切正常(至少在使用 DDMS 运行时),但过了一段时间(大约一个小时没有通过 DDMS 连接设备),计时器任务不再执行。让它再次工作的唯一方法是再次停止和启动服务,或者将设备与 DDMS 连接(使用 Eclipse);仅唤醒设备不会触发此操作。

看起来,Android 将服务设置为一种睡眠模式(查看设备上的活动服务时服务仍在运行)。

我的问题是:如何防止这种行为并保持服务始终正常运行?

我做了一些研究,发现理论上可以通过在服务中获取 (PARTIAL_WAKE_LOCK) WakeLock 来提供解决方案,但据我所知,使用此解决方案,我必须在 onStartService( ) 方法并在 onDestroy() 释放它,这意味着我在服务的生命周期内保持锁(这是永远的);我怀疑使用这种方法会耗尽电池。

还有其他方法可以做到这一点吗?

【问题讨论】:

    标签: java android service keep-alive


    【解决方案1】:

    我已经解决了这个问题,感谢上面的回复。

    我从 ScheduledPoolThreaExecutor() 切换到 AlarmManager。现在与 RTC_WAKEUP 类型一起处理所有触发器。

    我没有使用 IntentService,因为我的服务必须根据警报并行执行操作(并且 IntentService 实现了排队解决方案)。原始服务在原始实现中一直保持活动状态,现在仅在触发警报时创建。

    我也有这样的印象(但这只是一种直觉,而不是基于真实的测量结果,即这个新的实现(在需要时创建服务并且不是一直处于活动状态(等待计时器事件))是更好地延长设备的电池寿命。

    【讨论】:

      【解决方案2】:

      您需要多久执行一次,一直运行是什么意思?我猜你的意思不是一直在执行吗?

      我有一项服务可以做到这一点,而且效果很好:

      它使用警报管理器安排警报。触发警报时获取唤醒锁,执行一些工作,然后在释放唤醒锁之前安排新的警报。

      【讨论】:

      • 目前,每5分钟执行一个任务;另一个任务每天运行大约 5 次,但这取决于另一个任务的结果(理论上可以每 5 分钟运行一次)。
      • 我的意思是一直运行,即服务正在运行,但只等待来自计时器的唤醒触发器(因此服务大部分时间什么都不做)。
      • 使用 AlarmManager 会导致创建 3 个不同的服务(因为要执行 3 个不同的任务);此时操作的逻辑是这样一个任务影响下一个任务,因此执行此操作的逻辑围绕这些服务展开,而一个服务现在包含所有逻辑并将其绑定在一起。使用 ScheduledThreadPoolExecutor 类也不能达到同样的效果吗?
      • 不,您不需要 3 种不同的服务。请参阅此线程:stackoverflow.com/questions/3273342/…。不,您不应该使用 ScheduledThreadPoolExecutor。使用警报管理器的好处是您可以安排警报,然后终止您的进程,并仅在您应该执行时唤醒。这意味着您在不执行时不会消耗任何资源。
      【解决方案3】:

      将 IntentService 用于您的服务实现,并使用 AlarmManager 注册待处理的意图,以便在您需要的时间基础上触发这些意图。

      【讨论】:

        【解决方案4】:

        我已经使用唤醒锁定在之前的应用程序,我并不需要释放它们在的onDestroy(), 我简直有以下和它的工作完美: P>

        onClockListener{
           acquire wakelock
           method call
        }
        
        otherOnClickListener{
           release wakelock
           other method call
        }
        

        不知道是否会多大帮助,但它绝对不会帮助,如果我不交任何东西:) P>

        【讨论】:

          猜你喜欢
          • 2012-08-14
          • 1970-01-01
          • 2011-04-20
          • 1970-01-01
          • 2016-12-06
          • 1970-01-01
          • 1970-01-01
          • 2011-05-08
          • 2014-01-21
          相关资源
          最近更新 更多