【问题标题】:Will onCreate called after onStop without onDestroy in the middle将在 onStop 之后调用 onCreate 而中间没有 onDestroy
【发布时间】:2016-04-14 14:27:45
【问题描述】:

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

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

但在same page 中,它说:

受保护的 void onStop()
当您不再对 用户。接下来您将收到 onRestart()、onDestroy() 或 什么都没有,取决于以后的用户活动。

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

【问题讨论】:

    标签: android multithreading


    【解决方案1】:

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

    简短回答:

    长答案:

    如果在activity 上仅调用了onStop,则不会调用onCreate。在onStop 之后,如果用户导航回活动,则会调用onStart(在此之前还会调用onRestart)。

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

    为此,您需要在 android 中查看此进程优先级层次结构

    从调用onResume 但尚未调用onPause 起,活动仍处于前台进程中。而且由于前台进程具有最高优先级,因此不会被杀死。

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

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

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

    这就是为什么在问题图像(活动生命周期)中,如果App进程被杀死onCreate将在onStop之后被调用。

    编辑 1:

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

    如果您想在 API 级别 onLowMemory 回调,大致相当于 TRIM_MEMORY_COMPLETE

    【讨论】:

    • 您的回答很有帮助。不保证会调用 onDestroy()。奇怪的是没有 onKilled() 方法,所以不可能处理所有的活动死亡事件。我现在正在学习如何使用 Service 来解决我的问题。
    • @JeffreyChen,是的,有一些方法可以获取这些回调,我已经更新了我的答案,请通过它。
    【解决方案2】:

    当我离开我的应用很长时间然后又回来时,经常会发生这种情况。我认为这可能是由于多次调用 onCreate() 造成的。如何解决?

    onCreate()你可以检查你的后台线程是否正在运行,如果是则不要再次启动它。

    更重要的是,您的后台线程是service 还是AsyncTask 还是简单的Thread

    考虑到您问题中的措辞,如果您还没有使用它,我建议您使用service。它不会产生“多线程”问题。

    【讨论】:

    • handler.postDelayed([Runneable 及其 run() 包含这一行], SOME_PERIOD)。所以它会定期运行,直到布尔标志设置为 true。
    • 如果我在服务中启动我的任务,然后服务被杀死并重新创建。它似乎也产生了“多线程”问题。
    • @JeffreyChen 如果服务正在运行,它将不会再次运行。如果服务被终止并且您的程序再次启动它,它仍然只运行该服务的一个实例。
    • 但在我的情况下,服务每次重新创建时都会产生一个工作线程。是不是可以同时运行多个工作线程?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多