onCreate会在没有onDestroy的情况下在onStop之后调用吗?
从下图中,答案是肯定的。
但在same page中,它说:
protected void onStop()
当你不再可见时调用 用户。接下来您将收到onRestart(),onDestroy()或 没有,取决于以后的用户活动。
即使用户离开其他应用或关闭屏幕,我的应用也需要运行后台任务。应该停止任务的唯一情况是应用程序完全关闭。因此,我在onCreate()
中创建并运行后台线程,并在onDestroy()
中将其停止。我面临的问题是,有时我的线程不止一个同时运行。这经常发生在我离开我的应用程序很长一段时间然后回来。我认为可能是由于多次调用onCreate()
。怎么解决?
答案 0 :(得分:4)
onCreate会在没有onDestroy的情况下在onStop之后调用吗?
简短回答:否
答案很长:
如果在onCreate
上调用了onStop
,则无法调用{p> activity
。在onStop
之后,如果用户导航回活动,则会调用onStart
(之前也会调用onRestart
)。
现在让我解释一下在onCreate
之后如何调用onStop
而不调用onDestroy
。
为此,您需要在android:
中查看此进程优先级层次结构从调用onResume
开始,前台进程中的活动仍然存在,但onPause
尚未被调用。由于前台进程具有最高优先级,因此不会被杀死。
onPause
进行互动但是可见时,会调用 activity
。示例:当您在活动上方打开DialogFragment
时。然后,活动流程进入可见流程。这比前台进程的优先级低,但有足够的优先级不会被杀死。
此后不是onStop
,当用户不再能够看到活动时调用,这意味着活动不可见。
这就是活动过程进入后台流程的关键时刻。现在它可以被杀死,如果系统需要更多的内存并且你的活动比其他人消耗更多的内存(这是这个答案的主题,哪个背景首先被杀死)。
因此,如果活动处于后台且被系统杀死,则无法保证 onDestroy
被称为。在这种情况下,onCreate
将在onStop
之后调用onDestroy
而不调用onCreate
。
这就是为什么在问题图片(活动生命周期)中,如果应用程序进程被杀,则显示onStop
将在onDestroy
之后调用。< / p>
编辑1:
如果你想在活动被破坏之前处理任何事情(比如释放内存,杀死内存密集型任务等),并且由于不能保证调用interface CardRandomiser{
Card getCard(Suit suit);
}
void mockCard(Suit suit, Face face) {
CardRandomiser rand = mock(CardRandomiser.class);
when(rand.getCard(suit)).thenReturn(new Card(suit, face));
Game.setCardRandomiser(rand);
}
,你可以实现ComponentCallbacks2
(仅限)对于api级别&gt; = 14),在您的应用程序/活动的不同阶段接收onTrimMemory
回调。不同阶段及其解释是here。
如果要在API级别实现相同的&lt; 14,您可以使用onLowMemory
回调,大致相当于TRIM_MEMORY_COMPLETE
。
答案 1 :(得分:1)
当我离开我的应用程序很长一段时间然后回来时,通常会发生这种情况。我认为这可能是由于多次调用onCreate()。怎么解决?
在onCreate()
中,您可以检查后台主题是否正在运行,如果是,则不要再次启动它。
更重要的是,您的后台主题是service
或AsyncTask
还是简单的Thread
?
考虑到你问题中的措辞,如果你还没有使用它,我会建议你去service
。它不会创造多个线程&#34;问题
答案 2 :(得分:0)
请使用Service
运行后台任务。如果要在当前活动销毁时停止服务,可以使用Bind Service.
请发布您的代码段以获得确切的想法,您是如何尝试的。我们可以提供更多帮助