Android应用程序组件破坏和娱乐的详细信息

时间:2011-11-08 11:58:38

标签: android android-activity android-lifecycle

有人可能会把我推向一些具体的,值得信赖的(最好是简明的)有关以下内容的信息:

  1. 系统重新创建组件的顺序和(如适用) (片段,活动,活动的线程/ AsyncTasks /定时器, 静态数据(何时卸载类?),其他类中的Threads / AsyncTasks / Timers,host TabActivity,ActivityGroup,绑定本地服务,应用程序,进程) 当应用程序在后台和前台时 破坏可以在哪些点停止(可以遇到什么状态 返回应用程序时 - 比如“包括Application对象在内的所有东西 被毁坏,过程活着“?

  2. 是否有可能(不修改Android)以编程方式导致同样的破坏 我们自己,以便它与系统何时进行区分,或者当我们自己选择释放内存时需要一个单独的机制(由onLowMemory触发)?

  3. 1)所有场景的可靠复制步骤(junit.framework会这样做吗?我还没有调查过)?

  4. If the user leaves a task for a long time, the system clears the task of all activities except the root activity. When the user returns to the task again, only the root activity is restored”:这是否与流程/组件生命周期/销毁有关,还是与之相关?

  5. 我已阅读各种来源提供信息,通常是不完整和误导,有时是不正确的 我承认,我已经浏览了文档的某些部分,所以我可能错过了或误解了一些东西
    [编辑]为了避免误解:我要问的是Android销毁组件以释放内存,绕过 Activity.onDestroy。 当我将应用程序放在后台并稍后返回时,将会出现以下序列之一:

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

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

6 个答案:

答案 0 :(得分:2)

归功于此hackbod用于撰写here(阅读完整答案),并CommonsWare用于链接评论。

简而言之:所有docs,经过多次重写,继续骗我们。他们没有误导,他们只是给我们不真实的信息。除非你正在使用Fragments(dunno,如果支持v4也计算),Android会通过终止整个过程来释放内存,或者什么都不做。

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

  • 问题的第4点
  • 为什么我经常看到onCreate(notNull)on on Back on a Activity stack with Activities处理所有配置更改(Android 2.3.7)
  • 这与广泛接受的信念有什么关系,即onPause是你肯定会得到的最后一次通话,并且onStop可能永远不会被调用(然后,应用程序如何进入后台,被杀?)
但是,我们正在某个地方。

答案 1 :(得分:1)

这就是我的经验,以及我所提出的开发者的经验,似乎暗示:

    • 碎片未自动销毁。
    • 应用程序堆栈上的不可见活动可以按任何顺序和任意数量自动销毁。
    • 销毁活动(或任何其他类)在销毁应用程序之前,线程和静态保持不变。
    • TimerTasks:尚未测试。
    • 绑定本地服务:在销毁最后一个绑定活动和应用程序之间的某处销毁。
    • 应用程序是进程中的最后一件事,并且与所有线程“一起”。
    • 除非您有自动任务杀手,否则在销毁Application对象后该过程可能存在很长时间(20多分钟)。
    • TabActivity或ActivityGroups下的活动不会被自动销毁,但如果容器被销毁,请立即全部执行。
      示例:选项卡下具有ActivityGroups的TabActivity。所有活动都在。另一个活动已启动,全屏。其中包含所有内容的TabActivity现在可以同时被Android销毁,或者根本不能销毁。
  1. NO
    如果手动销毁活动,它将经历整个生命周期,并且在再次启动时不会将Bundle传递给onCreate。
    此外,onLowmemory是不可靠的 - 即使使用小的分配步骤,也可能永远不会在抛出OutOfMemoryError之前调用它。
  2. NO
    尽管自动解构/恢复是Android中的一个主要功能,但没有任何方法可以测试这种情况。
  3. 这可能仅与相关以确定流程是否仍然存在。如果是这样,Android将尝试恢复旧的活动。如果没有,那就是干净的重启。
  4. 以上包括一些假设 我还在等待有人确认并提供一些文档(保证不依赖于当前的类实现) 如果有任何错误,请纠正我
    编辑:以上信息可能已过时,已在Android 2.1-2.3上进行了测试

答案 2 :(得分:0)

这不是一个完整的答案,但我建议您在每种方法中放置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);

如果已经创建,则会显示调用onNewIntent()。总而言之,最好的事情就是观看Toast消息。您还需要专注于使用调试器。在每个方法上放置一个断点,你可以看到它。我确信的一件事是你不能直接调用像onPause()这样的方法。另请注意,一般情况下,您不知道何时调用onDestroy()

答案 3 :(得分:0)

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

活动生命周期:

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. 

片段具有不同的生命周期,包括onAttach,onCreateView和onActivityCreated方法。 但是,为什么你关心对象的破坏顺序?我看不出你有没有理由监控这些事件,但如果你真的需要,请了解更多有关垃圾收集器的信息。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

当涉及到活动时,它们将仅在Destroy()上销毁,直到开发人员手动调用finish()函数,

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

计时器任务将完成他们的工作并成为垃圾收集的候选者,一旦活动创建它们,任务在其自己的线程中运行,与活动无关,即使活动被销毁,任务也会自行完成.... / p>