1

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

任务

Main Activity/UI 有两个按钮,Start 和 Stop。应用程序应该循环两个任务,TaskA 和 TaskB。当按下开始时,循环被执行。这个循环里面有这些步骤——

  1. Main Activity 的 UI 上的更新状态:“TaskA execution in 60 seconds”
  2. 等待 60 秒
  3. 更新状态...:“TaskA Executing”
  4. 执行任务A
  5. 更新状态...:“TaskB 在 120 秒内执行”
  6. 等待 120 秒
  7. 更新状态...:“TaskB 正在执行”
  8. 执行任务B

完成后,循环重复。这个循环必须一直持续到用户按下停止。如果 Main Activity/UI 为 onPause、onStop 或 onDestroy,则此循环不得停止、中断或销毁。Main Activity/UI 应该与循环线程完全分开。

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

问题

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

潜在解决方案

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

但我的问题是:我能否创建一个完全独立于主活动/UI 线程的 IntentService,使其不依赖于主活动的生命周期或线程?

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

谢谢

4

1 回答 1

3

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

并不真地。IntentService专为事务性工作而设计:做几秒钟或几分钟的工作,然后离开。您需要的是可以更无限期地运行的东西。

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

通常与您的IntentService进程的主应用程序线程几乎没有关系。

更好的解决方案是常规的Service. 使用标准 JavaScheduledExecutorService来处理事件的计时并在后台线程上触发它们的工作。启动该服务的工作,由您的活动调用onStartCommand()触发。startService()停止您的服务中的这项工作,由您的活动调用onDestroy()触发。stopService()在 和 之间startService()stopService()您的服务将运行......至少一段时间。

更好的是,如果您的投票周期更长,可以使用AlarmManager它并让您及时控制此事件点。这样,您Service就不会一直阻塞内存。就目前而言,如果用户不重视您的服务,他们将倾向于杀死您的应用程序。

于 2013-04-18T00:10:03.063 回答