android 当“活动”不再运行时,是否保证调用onPause?

jvlzgdj9  于 2023-02-02  发布在  Android
关注(0)|答案(4)|浏览(235)

我在Activity中创建了一个新线程,并依靠onPause()来中断线程。如果应用崩溃,或者Activity不知何故不再存在,我希望线程被终止。
Activity/Fragment.onPause()是否保证在Activity不再运行时被调用?如果不能,如何保证相关线程被终止?

5jdjgkvh

5jdjgkvh1#

如果我的应用程序崩溃
这里没有调用onPause(),但这不应该困扰您,因为您的整个应用进程将不复存在,包括您创建的所有线程(UI或其他)。
活动以某种方式停止存在
每当Activity从前台移动到后台时,就会调用onPause()。Activity可以通过各种可能的方式关闭,但应用崩溃除外。不过,正如我上面提到的,应用崩溃也会默认杀死线程。
当Activity不再处于前台时,onPause()基本上会被调用。调用onPause()后,Activity可能仍然处于活动状态并在内存中,但我无法想象在不调用onPause()的情况下Activity处于活动状态并处于后台的场景。

wmtdaxz3

wmtdaxz32#

是的,onPause()将在Activity不再运行时调用。假设Activity已关闭,则事件序列将为onPause()-〉onStop()-〉onDestroy()。即使您的Activity在其他Activity启动时或屏幕关闭时进入后台,onPause()总是被调用,即使其他两个方法没有被调用,所以即使活动停止,onPause()也会被调用,你的线程也会被终止。
但是,当您的应用崩溃时,您的整个活动也会沿着,即使是您启动的线程,Android也会通过完成它来处理。

s6fujrry

s6fujrry3#

假设您有两个活动A和B。您从活动A导航到活动B。活动A转到后台,即活动A暂停。活动B获得焦点,即活动B进入前台。单击"后退"按钮时,活动B从后台堆栈弹出,活动A获得焦点,即活动A恢复。
当您在活动中显示对话框时,活动处于暂停状态,单击后退按钮时显示对话框,对话框关闭,活动恢复(前台)。
当Activity不再运行时,它处于后台,所以它被暂停。我同意Raghav Sood关于应用程序崩溃时会发生什么的观点。
通常应使用onPause()回调来执行以下操作:
停止动画或其他可能消耗CPU的正在进行的操作。提交未保存的更改,但仅当用户希望在离开时永久保存此类更改时(如电子邮件草稿)。释放系统资源,如广播接收器、传感器(如GPS)的句柄,或在Activity暂停且用户不需要时可能影响电池寿命的任何资源。
注:
可以同时在后台保留多个任务。但是,如果用户同时运行多个后台任务,系统可能会开始销毁后台Activity以恢复内存,从而导致Activity状态丢失。

eeq64g8w

eeq64g8w4#

除了这个公认的答案之外,我还想补充一点,基本上有一种方法可以捕捉任何发生的错误或崩溃。这允许你在应用退出之前做一些事情。例如,你可以保存整个日志,以便稍后发送到远程服务器进行调试。
这意味着如果你真的需要的话,你也可以做一些其他的轻计算的事情(正确地关闭活动的连接,等等)。

相关问题