11

我在活动中创建了一个新线程,我依靠 onPause() 来中断线程。如果我的应用程序崩溃,或者 Activity 不知何故不复存在,我希望线程被杀死。

Activity/Fragment.onPause() 是否保证在 Activity 不再运行时被调用?如果没有,我怎么能保证有问题的线程被杀死?

4

3 回答 3

15

如果我的应用程序崩溃

onPause()这里没有调用,但这不应该打扰您,因为您的整个应用程序进程不再存在,包括您创建的所有线程(UI 或其他)。

活动不知何故不复存在

onPause()每当您的 Activity 从前台移动到后台时,都会调用它,这是以可以关闭 Activity 的所有可能方式完成的,除了您的应用程序崩溃。然而,正如我上面提到的,应用程序崩溃也会默认杀死你的线程。

onPause()基本上只要您的 Activity 不再处于前台,就会调用它。在被调用后,您的 Activity 可能仍然活着并且在内存onPause()中,但是我无法想到您的 Activity 在没有onPause()被调用的情况下还活着并且在后台运行的场景。

于 2013-05-09T09:45:11.273 回答
5

是的,onPause()将在活动不再运行时调用。假设一个活动被关闭,那么事件序列将是onPause()-> onStop()-> onDestroy()。即使您的 Activity 在另一个 Activity 启动或屏幕关闭时滑入后台,onPause()即使没有调用其他两种方法,也始终会调用它。因此,即使活动停止,onPause()也会被调用并且您的线程将被杀死。

但是,当您的应用程序崩溃时,连同您的整个活动一起,即使是您启动的线程也会被 Android 处理并完成所有操作。

于 2013-05-09T09:45:03.037 回答
2

假设您有两个活动 A 和 B。您从 A 导航到 B。活动 A 进入后台,即活动 A 已暂停。活动 B 获得焦点,即前景。当您单击返回按钮时,活动 B 从返回堆栈中弹出,活动 A 获得焦点,即活动 A 恢复。

当您在活动中显示对话框时,活动处于暂停状态并在单击后退按钮时显示对话框,对话框被解除并且活动恢复(前台)。

当活动不再运行时,它在后台,所以它被暂停。我同意 Raghav Sood 的观点,即应用程序崩溃时会发生什么。

您通常应该使用 onPause() 回调来:

停止可能消耗 CPU 的动画或其他正在进行的操作。提交未保存的更改,但前提是用户希望在他们离开时永久保存此类更改(例如草稿电子邮件)。释放系统资源,例如广播接收器、传感器句柄(如 GPS),或在您的活动暂停且用户不需要它们时可能影响电池寿命的任何资源。

笔记 :

可以同时在后台执行多个任务。但是,如果用户同时运行多个后台任务,系统可能会开始销毁后台活动以恢复内存,从而导致活动状态丢失。

于 2013-05-09T09:53:16.443 回答