1

我有一个主要活动和一项服务。主要活动为服务准备数据。服务消费完数据后,它向mainactivity广播一个请求,mainactivity准备一些新数据并传递给服务......

mainactivity 允许用户操作数据。如果 mainactivity 不在前台,有时它会被杀死。

【问题1】:这里有点迷糊,我觉得mainactivity还在,但是它的UI线程和view被清空了?所以我不能使用 UI 线程从视图中读取值,然后将数据发送到服务?

[问题2]:如何检测到mainactivity被杀死,然后服务可以切换到自己准备数据?

【问题3】:如何强制系统“杀”?主要活动,所以我可以调试程序?

谢谢

更新:我可能会读到该图表,但我仍然无法完全理解这种行为。实际上,我的问题更像是这样的:从任务管理器中,我的应用程序有 1 个活动和 1 个服务,并消耗了 20MB 内存。半小时后,我的应用程序有 1 个活动和 1 个服务并消耗了 1.5MB 内存。显然,活动发生了一些事情,那是什么?请注意:我的活动使用 UI 线程循环来准备要服务的数据。停止/恢复对活动的 UI 线程没有影响,那么我怎么知道 UI 线程活动何时会被杀死?


更新:我使用 logcat 进行了测试,(在调用 onpause/onstop/ondestroy 时添加日志消息..),但是,当应用程序内存从 20mb 下降到 1.5mb 时,没有调用任何消息。

05-21 23:33:27.709: I/mytag(32012): 调用 onResume

05-21 23:33:30.606: I/mytag(32012): 调用 onPause

05-21 23:33:31.596: I/mytag(32012): 调用 onStop

[到目前为止,应用程序管理器显示我的应用程序使用 20mb 内存]

05-21 23:36:05.176: D/skia(32012): 从字体缓存中清除 144K [8 个条目]

05-21 23:36:05.246: D/dalvikvm(32012): GC_EXPLICIT 释放 1240K,52% 释放 4329K/8839K,外部 1716K/2137K,暂停 54ms

05-22 00:00:10.226: D/dalvikvm(32012): GC_EXPLICIT 释放 933K, 53% 释放 4226K/8839K, 外部 1684K/2137K, 暂停 85ms

05-22 00:36:10.166: D/dalvikvm(814): GC_EXPLICIT 释放 56K, 49% 释放 2775K/5379K, 外部 1625K/2137K, 暂停 61ms

[到目前为止,应用程序管理器显示我的应用程序使用 1.5mb 内存]

我等了半个小时,我没有再收到任何 logcat 文本,测试结束。

我想检测系统清除我的应用程序内存,但它不会触发任何“onpause、/onstop 等”,我如何检测它,然后告诉服务做某事?谢谢

4

1 回答 1

1

请查看 Activity 生命周期。

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

2 和 3 的答案在那里(为 onStop 或 onDestroy 实现一些东西来“告诉”服务该活动被杀死/等)。OnDestroy 是唯一一次“真正”即将被杀死的东西。

至于第一点,我不完全理解你的问题,所以也许你可以更好地解释一下?我对第一个的唯一想法是您正在处理重新创建活动的方向更改(这可能会导致一些问题,具体取决于您创建/添加视图的方式)。

编辑:从上面发布的链接..

- 如果一个活动失去焦点但仍然可见(即,一个新的非全尺寸或透明活动的焦点位于您的活动之上),它会被暂停。暂停的活动是完全活动的(它维护所有状态和成员信息并保持连接到窗口管理器),但可以在内存极低的情况下被系统杀死。

- 如果一个活动被另一个活动完全遮蔽,它就会停止。它仍然保留所有状态和成员信息,但是,它不再对用户可见,因此它的窗口是隐藏的,并且当其他地方需要内存时,它通常会被系统杀死。

- 如果一个活动被暂停或停止,系统可以通过要求它完成或简单地终止其进程来从内存中删除该活动。当它再次显示给用户时,它必须完全重新启动并恢复到之前的状态。

于 2013-05-20T14:27:28.437 回答