android - 将在 onStop 之后调用 onCreate 而中间没有 onDestroy

标签 android multithreading

如果中间没有 onDestroy,onCreate 会在 onStop 之后调用吗?

从下图来看,答案是肯定的。

Activity Life Cycle

但是在same page ,它说:

protected void onStop()
Called when you are no longer visible to the user. You will next receive either onRestart(), onDestroy(), or nothing, depending on later user activity.

即使用户离开另一个应用程序或关闭屏幕,我的应用程序也需要运行后台任务。唯一应该停止任务的情况是应用程序完全关闭。所以我在 onCreate() 中创建并运行后台线程,并在 onDestroy() 中停止它。我面临的问题是有时我的多个线程同时运行。当我离开我的应用程序很长时间然后又回来时,经常会发生这种情况。我认为这可能是由于 onCreate() 的多次调用所致。如何解决?

最佳答案

Will onCreate called after onStop without onDestroy in the middle?

简短回答:

长答案:

如果在 activity 上仅调用了 onStop,则不会调用

onCreate。在 onStop 之后,如果用户导航回到 Activity,则会调用 onStart(在此之前 onRestart 也将被调用)。

enter image description here

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

为此,您需要查看 android 中的这个进程优先级层次结构:

enter image description here

onResume 被调用但 onPause 未被调用时,Activity 保留在前台进程中。由于前台进程具有最高优先级,因此它不会被杀死。

onPause用户不再能够与 activity 交互但可见 时调用。示例:当您在 Activity 上方打开 DialogFragment 时。然后 Activity 过程进入可见过程。这比前台进程的优先级低,但有足够的优先级不会被杀死。

之后是onStop,当用户不再能够看到 Activity 时调用,这意味着 Activity 不可见。 这就是 Activity 流程进入后台流程的时候。现在,如果系统需要更多内存并且您的 Activity 比其他 Activity 消耗更多内存,它可以被杀死(这是本答案的题外话,哪个背景首先被杀死)。

因此,如果一个 Activity 在后台并被系统杀死,则不能保证调用 onDestroy。在这种情况下,onCreate 将在 onStop 之后调用,而 onDestroy 不会被调用。

enter image description here

这就是为什么在问题图片( Activity 生命周期)中显示如果 App 进程被终止onCreate 将在 onStop 之后调用.

编辑 1:

如果您想在 Activity 被销毁之前处理任何事情(如释放内存、终止内存密集型任务等),并且由于不能保证调用 onDestroy,您可以实现 ComponentCallbacks2 (仅适用于 api 级别 >= 14)接收 onTrimMemory回调与您的应用程序/Activity 的不同阶段。不同的阶段及其解释是 here .

如果您想在 API 级别 < 14 中实现相同的功能,您可以使用 onLowMemory大致相当于 TRIM_MEMORY_COMPLETE 的回调.

关于android - 将在 onStop 之后调用 onCreate 而中间没有 onDestroy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36589046/

相关文章:

c++ - 单元测试仅在 ARM 中失败

android - Android NDK 中的系统调用

java - Android/Java - 从列表中删除方法引用

android - 如何将github代码导入你的android studio项目

iphone - iPhone “Device”内存泄漏

java - 我从基于 Java 的 AWS lambda 处理程序启动一个单独的线程,有时会完成,有时不会,为什么?如何保证线程完成?

c++ - 从多个线程更新对应于 unordred_map 中不同现有键的值

c - 如果函数中已有线程,如何防止线程进入该函数?

android - 如何测试android抽象 Activity ?

android - ArrayAdapter 类的 IndexOutOfBoundsException 问题