Android应用程序组件销毁和重新创建的详细信息

Android应用程序组件销毁和重新创建的详细信息,android,android-activity,android-lifecycle,Android,Android Activity,Android Lifecycle,有没有人能告诉我一些具体的、可信的(最好是简洁的)信息: 系统销毁和(如适用)重新创建组件的顺序 (片段、活动、活动的线程/异步任务/计时器、, 静态数据(类何时卸载?),其他类中的线程/异步任务/计时器,主机 TabActivity、ActivityGroup、绑定本地服务、应用程序、流程) 当应用程序位于后台和前台时。 在哪些点可以停止破坏(会遇到哪些状态 返回应用程序后,类似“所有内容,包括应用程序对象” 摧毁,进程活着“ 是否有可能(在不修改Android的情况下)以编程方式造成同样的破

有没有人能告诉我一些具体的、可信的(最好是简洁的)信息:

  • 系统销毁和(如适用)重新创建组件的顺序 (片段、活动、活动的线程/异步任务/计时器、, 静态数据(类何时卸载?),其他类中的线程/异步任务/计时器,主机 TabActivity、ActivityGroup、绑定本地服务、应用程序、流程) 当应用程序位于后台和前台时。
    在哪些点可以停止破坏(会遇到哪些状态 返回应用程序后,类似“所有内容,包括应用程序对象” 摧毁,进程活着“

  • 是否有可能(在不修改Android的情况下)以编程方式造成同样的破坏 我们自己,所以它与系统执行时无法区分,或者是我们自己选择释放内存(由onLowMemory触发)时需要一个单独的机制

  • 1中所有场景的可靠复制步骤(junit.framework可以吗?我还没有对此进行调查)

  • “”:这与流程/组件生命周期/销毁无关,还是与之相关

  • 我阅读过各种来源提供的信息,这些信息往往不完整、误导,有时甚至不正确。
    我承认,我浏览了文档的某些部分,因此可能遗漏或误解了某些内容。


    [编辑]为了避免误解:我想问的是Android破坏组件以释放内存,绕过Activity.onDestroy。
    当我将应用程序置于后台并稍后返回时,将出现以下序列之一:

    • 暂停、停止、重新启动、启动、恢复
    • onPause、onStop、Application.onCreate、onCreate(notNull)、onStart、onResume
    [编辑二] 赏金开始了。需要关于以下方面的可靠信息:活动、片段、应用程序、绑定(可能是远程)服务、流程。

    部分/完全销毁场景。请参阅第1点。

    这不是一个完整的答案,但我建议您在这些方法中的每个方法中放置toast消息。加入你自己的
    onPause()
    onStop()
    onResume()
    ,等等,然后在里面放一行如下:

    Toast.makeText(this, "onPause()", Toast.LENGTH_SHORT).show();
    
    您不能直接调用这些方法,但是将另一个活动移动到堆栈顶部会导致调用现有活动上的这些方法。需要记住的另一件事是,不必每次启动活动时都调用
    onCreate()
    。这实际上取决于您如何开始活动,例如,如果您发送此意图

    Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
    

    如果已创建,则它将显示为call
    onNewIntent()
    。总之,最好的办法就是看祝酒词。此外,您还需要关注调试器的使用。在每个方法上放置一个断点,您就可以看到它了。我确信的一点是,您不能直接调用这些方法,如
    onPause()
    。还请记住,通常您不知道何时调用
    ondestory()

    这就是我和我所问的开发人员的经验所表明的:

    • 碎片不会自动销毁。
    • 应用程序堆栈上的不可见活动可以任意顺序、任意数量自动销毁。
    • 被销毁的活动(或任何其他类)的线程和静态保持不变,直到应用程序被销毁。
    • TimerTasks:尚未测试。
    • 绑定的本地服务:在销毁最后一个绑定活动和应用程序之间的某个位置被销毁。
    • 应用程序是进程中最后一个运行的程序,与所有线程一起运行。
    • 销毁应用程序对象后,进程可能会存在很长时间(20分钟以上),除非您有自动任务杀手。
    • TabActivity下或ActivityGroup中的活动不会自动销毁,但如果容器已销毁,则会立即全部销毁。
      示例:选项卡下有ActivityGroups的选项卡Activity。所有活动都是现场直播的。另一个活动将全屏启动。包含所有内容的TabActivity现在有资格被Android销毁,不管是一次性销毁还是完全不销毁
  • 否。
    如果手动销毁活动,它将贯穿整个生命周期,并且在再次启动时不会将捆绑传递给onCreate。
    此外,onLowmemory是不可靠的-即使是很小的分配步骤,在抛出OutOfMemoryError之前也可能永远不会调用它
  • 否。
    尽管自动销毁/恢复是Android的一个主要功能,但没有任何方法来测试这种场景
  • 这可能只与流程是否仍然存在有关。如果是这样,Android将尝试恢复旧的活动。如果不是,那就是一次全新的重启
  • 以上包括一些假设。
    我仍在等待有人确认并提供一些文档(保证不依赖于类的当前实现)。
    如果有任何错误,请纠正我。

    编辑:上面的信息可能已经过时了,它是在Android 2.1-2.3上测试的

    写这篇文章(阅读整个答案)和在评论中链接的功劳。

    简言之:所有这些被改写了很多次的故事都在继续对我们撒谎。他们没有误导我们,只是给了我们不真实的信息。除非您使用的是片段(如果支持v4也算不上),否则Android会通过终止整个进程来释放内存,或者什么都不做。

    当然,这并不能解决所有问题:

    • 问题的第4点
    • 为什么我经常看到onCreate(notNull)在活动堆栈上按下,活动处理所有配置更改(Android 2.3.7)
    • 这与普遍接受的“onPause是你最后一次打电话”这一信念有什么关系
      onCreate() - Called after the instance of the activity has been created for the first  time
      onRestart() - Called after an activity has been interrupted, just before the onStart();
      onStart() - Called when the object activity and their visions become visible to the user;
      onResume()-  Called when the object activity and their visions become interactive to the user;
      onPause() - Called when a different instance of the activity is going to get visible and the present activity ceases to interact with the user
      onStop() - Called when the activity is no longer visible or is not interacting
      onDestroy() - Called when an activity instance must be destroyed and it's no longer needed.