Android应用程序组件销毁和娱乐的细节

有人能把我推向一些具体的,值得信赖的(最好是简洁的)关于以下方面的信息:

  1. (Fragment,Activity,Activity的线程/ AsyncTasks / Timers,静态数据(什么时候是类被卸载?),其他类中的线程/ AsyncTasks / Timers,主机TabActivity, ActivityGroup,绑定的本地服务,应用程序,进程),当应用程序在后台,并在前台。
    在哪些点销毁可以停止(返回到应用程序可以遇到什么状态 – 像“包括应用程序对象被销毁,进程活着”的一切?

  2. 是否有可能(无需修改Android)以编程方式导致同一种types的破坏,从而与系统执行操作时难以区分,还是当我们自己select释放内存(由onLowMemory触发)时需要单独的机制?

  3. 所有场景的可靠的再现步骤从1)(junit.framework会吗?我没有调查过)?

  4. “ 如果用户长时间离开任务,系统将清除除根活动以外的所有活动的任务,当用户再次返回到任务时,只有根活动恢复 ”:除了进程/组件生命周期/销毁,还是束缚它?

我已经阅读了各种消息来源给出的信息,往往不完整和误导,有时不正确。
我承认,我已经浏览了文档的某些部分,所以我可能错过了或误解了一些东西。

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

  • onPause,onStop,onRestart,onStart,onResume
  • onPause,onStop,Application.onCreate,onCreate(notNull),onStart,onResume

[EDIT2]赏金开始了。 需要以下方面的可靠信息:活动,碎片,应用程序,绑定(可能是远程的)服务,进程。
部分/全面销毁情况。 见第一点。

Solutions Collecting From Web of "Android应用程序组件销毁和娱乐的细节"

对此的信用可以在这里写出来(阅读整个答案),以及CommonsWare中的链接评论。

简而言之:所有的文件 ,改写了很多次,继续骗我们。 他们没有误导,他们只是给我们不真实的信息。 除非你使用Fragments(也不知道是否支持v4),Android通过杀死整个进程来释放内存,或者什么也不做。

当然,这并没有解决一切:

  • 问题的第4点
  • 为什么我经常看到onCreate(notNull)在按下活动堆栈上的活动处理所有configuration更改(Android 2.3.7)
  • 这与普遍接受的观点有什么关系:onPause是你最后一次打电话的时间,onStop可能永远不会被调用(那么应用程序到底会被杀呢?)

不过,我们正在某处。

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

    • 片段不被autodestroyed。
    • 不可见应用程序堆栈上的活动可以以任何顺序和任意数量进行自动销毁。
    • 被销毁的Activity(或任何其他类)线程和静态在触发Application之前保持不变。
    • TimerTasks:没有testing过。
    • 绑定本地服务:销毁最后一个绑定活动和应用程序之间的某处。
    • 应用程序是stream程中最后一件事情,并与所有线程一起“走”。
    • 除非你有一个自动的任务杀手,否则该进程在应用程序对象被销毁之后可能存在很长时间(20+分钟)。
    • TabActivity或ActivityGroups下的活动不会被autodestroyed,但是如果容器被销毁,则全部一起去。
      示例:标签下带有ActivityGroups的TabActivity。 所有活动都在现场 另一个活动开始,全屏。 带有所有内容的TabActivity现在有资格被Android破坏,一次或者根本不破坏。
  1. NO
    如果您手动销毁某个活动,则会贯穿整个生命周期,并且在再次启动时不会将Bundle传递给onCreate。
    此外,onLowMemory是不可靠的 – 即使分配步骤很less,在抛出OutOfMemoryError之前也可能不会调用它。
  2. NO
    尽pipeAndroid中的自动修复/恢复是一个主要function,但是没有任何方法来testing这种情况。
  3. 这可能与stream程是否存在有关。 如果是这样,Android会尝试恢复旧的活动。 如果没有,这是一个干净的重新启动。

以上包括一些假设。
我仍在等待某人确认并提供一些文档(保证不依赖于当前实施的课程)。
请,如果有任何错误,请纠正我。

编辑:上面的信息可能会过时,它在Android 2.1-2.3上testing

那么,我的朋友,我想你的研究会遇到很多麻烦。 基本上,因为你在谈论两个黑盒子:Dalvik垃圾收集器和android堆pipe理器。 我会说,你不能相信,Android将遵循任何对象销毁的顺序。 但是,你可以相信这个生命周期将会被遵循[编程Android,2011]:

Activity生命周期:

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. 

片段有不同的生命周期,包括onTrech,onCreateView和onActivityCreated方法。 但是,你为什么关心破坏的对象顺序呢? 我看不出有什么理由要监视这样的事件,但是如果真的需要的话,可以详细了解垃圾收集器。

  1. ActivityManagerService#trimApplications()方法删除所有未使用的应用程序进程,如果应用程序的当前接收者为空,没有任何活动和服务。

当涉及到活动时,它们只会在Destroy()上销毁,除非开发人员手动调用finish()函数,

片段生命周期与其父活动完全匹配,所以当父活动在Destroy()上销毁时,Destroy()上的片段也将被调用。

计时器任务将完成他们的工作,成为垃圾收集的候选人,一旦活动创build他们的任务运行在自己的线程,没有活动的关系,即使活动被破坏,任务完成自己….

这不是一个完整的答案,但我会build议您在这些方法中的每一个放置吐司消息。 在你自己的onPause()onStop()onResume()等等里面添加一行,如下所示:

 Toast.makeText(this, "onPause()", Toast.LENGTH_SHORT).show(); 

您不能直接调用这些方法,但是将另一个活动移动到堆栈顶部将导致调用现有活动的这些方法。 还有一件事要记住的是, onCreate()不需要每次启动一个活动都被调用。 这真的取决于你如何开始活动,例如,如果你发送这个意图

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

它会出现调用onNewIntent()而不是如果它已经被创build。 总之,最好的事情就是观看Toast消息。 此外,你真的需要专注于使用debugging器。 在每个方法上放置一个断点,你可以看到它。 我确信的一件事是你不能像onPause()那样直接调用这些方法。 另外请记住,一般来说,你不知道什么时候会调用onDestroy()