20

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

  1. 组件被系统销毁和(如果适用)重新创建的顺序(片段、活动、活动的线程/异步任务/定时器、静态数据(何时卸载类?)、其他类中的线程/异步任务/定时器、宿主 TabActivity、 ActivityGroup,绑定本地服务,应用程序,进程)当应用程序在后台和前台时。
    在什么时候可以停止销毁(返回应用程序时会遇到哪些状态 - 例如“包括应用程序对象在内的所有内容都已销毁,进程处于活动状态”?

  2. 是否有可能(在不修改 Android 的情况下)以编程方式自己造成相同类型的破坏,以便与系统何时执行此操作时无法区分,或者当我们自己选择释放内存(由 onLowMemory 触发)时是否需要单独的机制?

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

  4. 如果用户长时间离开一个任务,系统会清除该任务除根Activity之外的所有Activity。当用户再次返回该任务时,只恢复根Activity ”:这是除了流程/组件之外生命周期/销毁,还是与之相关?

我已经阅读了各种来源提供的信息,这些信息通常不完整且具有误导性,有时甚至是不正确的。
我承认,我浏览了文档的某些部分,所以我可能遗漏或误解了某些内容。

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

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

[EDIT2] 赏金开始了。需要有关以下方面的可靠信息:活动、片段、应用程序、绑定(可能是远程)服务、流程。
部分/全部破坏场景。见第 1 点。

4

6 回答 6

2

这要归功于 hackbod在这里编写它(阅读整个答案),以及CommonsWare以在评论中链接。

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

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

  • 问题的第 4 点
  • 为什么我经常看到 onCreate(notNull) 在 Activity 堆栈上按 Back 并处理所有配置更改(Android 2.3.7)
  • 这与广泛接受的信念有何关系,即 onPause 是您肯定会得到的最后一个调用,而 onStop 可能永远不会被调用(那么,应用程序如何进入后台,被杀死?)

不过,我们正在取得进展。

于 2013-02-14T09:27:56.723 回答
1

这就是我的经验,以及我问过的开发人员的经验,似乎表明:

    • 片段不会自动销毁。
    • 应用程序堆栈上的不可见活动可以按任意顺序和任意数量自动销毁。
    • 销毁的活动(或任何其他类)的线程和静态保持不变,直到应用程序被销毁。
    • TimerTasks:尚未测试。
    • 绑定本地服务:在最后一个绑定活动和应用程序的销毁之间的某处被销毁。
    • 应用程序是进程中的最后一件事,并且与所有线程一起“进行”。
    • 在 Application 对象销毁后,该进程可以存在很长时间(20 多分钟),除非您有自动任务杀手。
    • TabActivity 或 ActivityGroups 下的活动不会自动销毁,但如果容器被销毁,则会立即全部执行。
      示例:选项卡下带有 ActivityGroups 的 TabActivity。所有活动都直播。另一个 Activity 启动,全屏。包含所有内容的 TabActivity 现在可以被 Android 销毁,一次全部销毁,或者根本不销毁。
  1. 没有
    如果您手动销毁 Activity,它会经历整个生命周期,并且在再次启动时不会将 Bundle 传递给 onCreate。
    此外,onLowmemory 是不可靠的——即使分配步骤很小,在抛出 OutOfMemoryError 之前它也可能永远不会被调用。
  2. 没有
    尽管自动销毁/恢复是 Android 中的一项主要功能,但没有任何方法可以测试此类场景。
  3. 这可能与该过程是否仍然存在有关。如果是这样,Android 将尝试恢复旧的活动。如果没有,这是一个干净的重新启动。

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

编辑:以上信息可能已过时,已在 Android 2.1-2.3 上测试过

于 2011-12-01T11:32:16.910 回答
1

好吧,我的朋友,我猜你的研究会遇到很多麻烦。基本上是因为你在谈论两个黑盒子: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。但是,你为什么要关心对象的破坏顺序呢?我看不出您没有理由监视此类事件,但是如果您确实需要,请了解有关垃圾收集器的更多信息。

于 2013-06-14T03:38:15.517 回答
0

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

Fragment 的生命周期与其父 Activity 完全匹配,因此当父 Activity 在 Destroy() 上销毁时,Destroy() 上的 Fragment 也会被调用。

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

于 2013-10-09T18:24:43.043 回答
0
  1. ActivityManagerService#trimApplications() 方法如果应用程序的当前接收者为空、没有任何活动和服务,则删除任何未使用的应用程序进程。
于 2013-08-29T01:37:54.093 回答
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()如果它已经创建,它将显示为 call 。总之,最好的事情就是观看 Toast 消息。此外,您确实需要专注于使用调试器。在每个方法上放置一个断点,您就可以看到它。我确信的一件事是您不能直接调用这些方法,例如onPause(). 还要记住,通常你不知道什么时候onDestroy()会被调用。

于 2011-11-12T02:12:36.027 回答