基本上,我需要编写代码很简单,但由于我是初学者,我仍然对Service,IntentService,创建一个与主Activity / UI线程分开的新线程等感到困惑。我将解释首先是任务,然后我认为这可能是最好的。
任务
主要活动/用户界面有两个按钮,即开始和停止。应用程序应该循环执行两个任务,TaskA和TaskB。按下Start时,执行循环。这个循环里面有这些步骤 -
完成后,循环重复。此循环必须持续到用户按下“停止”。如果主活动/ UI处于onPause,onStop或onDestroy,则此循环不得停止,中断或销毁。主活动/ UI应与循环线程完全分开。
停止按钮:停止循环内所有步骤的执行,无论它是哪一步。取消所有计划任务并停止服务。应用程序现在应该处于的状态必须是第一次启动应用程序(与按下“开始”之前的状态相同)。
问题
我不确定Service和IntentService的全部功能。我知道Service可以执行多线程,而IntentService执行任务队列并逐个执行它们。
潜在解决方案
我上面的循环需要按照确切的顺序执行这8个步骤,因此IntentService将是理想的解决方案。
但我的问题是:我可以创建一个完全独立于Main Activity / UI线程的IntentService,以便它不依赖于Main Activity的生命周期或线程吗?
如果没有,那么实现这一目标的理想选择是什么?
由于
答案 0 :(得分:3)
我上面的循环需要按照确切的顺序执行这8个步骤,因此IntentService将是理想的解决方案。
不是真的。 IntentService
专为交易工作而设计:做几秒钟或几分钟的工作,然后离开。你需要的是能够无限期运行的东西。
我可以创建一个完全独立于Main Activity / UI线程的IntentService,以便它不依赖于Main Activity的生命周期或线程吗?
IntentService
通常与您的流程主应用程序线程无关。
更好的解决方案是常规Service
。使用标准Java ScheduledExecutorService
来处理事件的时间并在后台线程上触发它们的工作。从您的活动onStartCommand()
电话触发,在服务的startService()
开始工作。停止在您的服务的onDestroy()
内停止工作,该活动是通过您的活动stopService()
来触发的。在startService()
和stopService()
之间,您的服务至少会运行一段时间。
更好的是,如果您的投票期更长,则可以使用AlarmManager
并让它控制此事件的时间点。这样,你的Service
不会一直堵塞记忆。就目前而言,如果用户不重视您的服务,他们将倾向于任务杀死您的应用。