onCreate会在onStop之后调用,而不会在中间使用onDestroy

时间:2016-04-13 05:06:11

标签: android multithreading

onCreate会在没有onDestroy的情况下在onStop之后调用吗?

从下图中,答案是肯定的。

Activity Life Cycle

但在same page中,它说:

  

protected void onStop()
  当你不再可见时调用   用户。接下来您将收到onRestart(),onDestroy()或   没有,取决于以后的用户活动。

即使用户离开其他应用或关闭屏幕,我的应用也需要运行后台任务。应该停止任务的唯一情况是应用程序完全关闭。因此,我在onCreate()中创建并运行后台线程,并在onDestroy()中将其停止。我面临的问题是,有时我的线程不止一个同时运行。这经常发生在我离开我的应用程序很长一段时间然后回来。我认为可能是由于多次调用onCreate()。怎么解决?

3 个答案:

答案 0 :(得分:4)

  

onCreate会在没有onDestroy的情况下在onStop之后调用吗?

简短回答:

答案很长:

如果在onCreate上调用了onStop,则无法调用{p> activity。在onStop之后,如果用户导航回活动,则会调用onStart(之前也会调用onRestart)。

enter image description here

现在让我解释一下在onCreate之后如何调用onStop而不调用onDestroy

为此,您需要在android:

中查看此进程优先级层次结构

enter image description here

从调用onResume开始,前台进程中的活动仍然存在,但onPause尚未被调用。由于前台进程具有最高优先级,因此不会被杀死。

用户无法再与onPause进行互动但是可见时,会调用

activity。示例:当您在活动上方打开DialogFragment时。然后,活动流程进入可见流程。这比前台进程的优先级低,但有足够的优先级不会被杀死。

此后不是onStop,当用户不再能够看到活动时调用,这意味着活动不可见。 这就是活动过程进入后台流程的关键时刻。现在它可以被杀死,如果系统需要更多的内存并且你的活动比其他人消耗更多的内存(这是这个答案的主题,哪个背景首先被杀死)。

因此,如果活动处于后台且被系统杀死,则无法保证 onDestroy被称为。在这种情况下,onCreate将在onStop之后调用onDestroy而不调用onCreate

enter image description here

这就是为什么在问题图片(活动生命周期)中,如果应用程序进程被杀,则显示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()中,您可以检查后台主题是否正在运行,如果是,则不要再次启动它。

更重要的是,您的后台主题是serviceAsyncTask还是简单的Thread

考虑到你问题中的措辞,如果你还没有使用它,我会建议你去service。它不会创造多个线程&#34;问题

答案 2 :(得分:0)

请使用Service运行后台任务。如果要在当前活动销毁时停止服务,可以使用Bind Service.

请发布您的代码段以获得确切的想法,您是如何尝试的。我们可以提供更多帮助