我想知道必须满足哪些条件才能让Android停止Service
,除了显而易见的内存不足之外。
请参阅,我运行引导Service
,持有本地BroadcastReceiver
。服务本身包含一个状态机,因此我从一个自举状态转换到另一个状态。每个状态转换函数都以AsyncTask
或IntentService
开始,一旦完成,它会将Intent
发送回服务,让它知道任务是执行成功。然而,在此期间,服务停止了,因此意图被分配到任何东西,这是令人沮丧的。
我不想使用Foreground Service而且我不想为了让我的服务保持活力而四处乱转。我也不想依赖于onHandleIntent()
的{{1}},因为IntentService
会丢失其所有状态,这意味着所有成员一旦通过就会被取消,所以当stateA完成并且stateB应该开始,整个状态机是空的,所有以前的状态都消失了,等等....
我将IntentService
上下文提交给每个Services
/ IntentService
,我想,只要他们拥有服务上下文的引用,AsnycTask
就不会停止。可悲的是,事实并非如此......
我是否必须在Service
和doInBackground()
时调用上下文中的方法,只是为了让AsyncTask
保持活着状态?
答案 0 :(得分:0)
除系统内存不足外,如果您的服务超出一定的内存量(check limitations),您可以终止您的进程。
与服务流程一样,前台流程可以延长服务的使用寿命,但您也无法保证。
我认为你最好的机会是在START_STICKY模式(link)中制作符合服务的逻辑。
答案 1 :(得分:0)
我想知道必须满足哪些条件才能让Android停止服务,除了显而易见的内存不足之外。
用户可以出于任何原因随时停止服务,可以通过直接停止单个服务,或者(更有可能)终止整个过程。
如果服务崩溃,Android会单独停止服务。更常见的是,它终止整个过程以回收该进程的内存以供其他用途。
我运行一个自举服务,持有本地BroadcastReceiver
我怀疑任何人,但你知道“bootstrapping”在这种情况下意味着什么。
每个状态转换函数都启动AsyncTask或IntentService,一旦完成,它会将Intent调度回Service,让它知道任务已成功执行。
使用AsyncTask
中的Service
通常毫无意义。您不希望在Service
中的主应用程序线程上执行任务,而AsyncTask
背后的要点是在主应用程序线程上执行某些操作(例如,onPostExecute()
)。使用Thread
。
使用IntentService
中的Service
毫无意义且浪费。你已经有了Service
- 它正在进行“自举”。您不需要其他 Service
。使用Thread
。
然而,在此期间,服务暂停,因此意图被分配到任何东西,这是令人沮丧的。
更有可能的是,整个过程都消失了。
我将Services上下文提交给每个IntentService / AsnycTask
我不完全清楚“提交”在这里是什么意思,但如果您将Context
(Service
)传递给另一个Context
(IntentService
),那就是严重的代码味道。
只要他们持有服务上下文的引用,服务就不会停止
没有。此外,这些都不会阻止Android终止您的流程。
我是否必须在doInBackground()和AsyncTask上调用上下文中的方法,只是为了让服务保持活动状态?
不,你需要保持你的状态机持久(a.k.a。,一个文件),这样如果你的进程由于某种原因终止,当你再次运行时,你可以从你离开的地方继续。