Android Java服务和计时器/线程休眠

时间:2013-04-17 22:18:22

标签: android service timer sleep intentservice

基本上,我需要编写代码很简单,但由于我是初学者,我仍然对Service,IntentService,创建一个与主Activity / UI线程分开的新线程等感到困惑。我将解释首先是任务,然后我认为这可能是最好的。

任务

主要活动/用户界面有两个按钮,即开始和停止。应用程序应该循环执行两个任务,TaskA和TaskB。按下Start时,执行循环。这个循环里面有这些步骤 -

  1. 在主活动的UI上更新状态:“60秒内执行任务”
  2. 等待60秒
  3. 更新状态...:“TaskA Executing”
  4. 执行TaskA
  5. 更新状态......:“120秒内执行任务B”
  6. 等待120秒
  7. 更新状态...:“TaskB Executing”
  8. 执行TaskB
  9. 完成后,循环重复。此循环必须持续到用户按下“停止”。如果主活动/ UI处于onPause,onStop或onDestroy,则此循环不得停止,中断或销毁。主活动/ UI应与循环线程完全分开。

    停止按钮:停止循环内所有步骤的执行,无论它是哪一步。取消所有计划任务并停止服务。应用程序现在应该处于的状态必须是第一次启动应用程序(与按下“开始”之前的状态相同)。

    问题

    我不确定Service和IntentService的全部功能。我知道Service可以执行多线程,而IntentService执行任务队列并逐个执行它们。

    潜在解决方案

    我上面的循环需要按照确切的顺序执行这8个步骤,因此IntentService将是理想的解决方案。

    但我的问题是:我可以创建一个完全独立于Main Activity / UI线程的IntentService,以便它不依赖于Main Activity的生命周期或线程吗?

    如果没有,那么实现这一目标的理想选择是什么?

    由于

1 个答案:

答案 0 :(得分:3)

  

我上面的循环需要按照确切的顺序执行这8个步骤,因此IntentService将是理想的解决方案。

不是真的。 IntentService专为交易工作而设计:做几秒钟或几分钟的工作,然后离开。你需要的是能够无限期运行的东西。

  

我可以创建一个完全独立于Main Activity / UI线程的IntentService,以便它不依赖于Main Activity的生命周期或线程吗?

IntentService通常与您的流程主应用程序线程无关。

更好的解决方案是常规Service。使用标准Java ScheduledExecutorService来处理事件的时间并在后台线程上触发它们的工作。从您的活动onStartCommand()电话触发,在服务的startService()开始工作。停止在您的服务的onDestroy()内停止工作,该活动是通过您的活动stopService()来触发的。在startService()stopService()之间,您的服务至少会运行一段时间。

更好的是,如果您的投票期更长,则可以使用AlarmManager并让它控制此事件的时间点。这样,你的Service不会一直堵塞记忆。就目前而言,如果用户不重视您的服务,他们将倾向于任务杀死您的应用。