0

在某些情况下,无论应用程序发生什么,我们都需要在最后执行一些代码。有什么方法可以实现finally()Android 中的功能?

注意:崩溃期间不会调用 OnDestroy。

事实上,finally()当JVM退出时,甚至不是一个完整的证明方法。但是在 Java 中我们没有看到太多的 JVM 退出。但是在 android 中,因为我们为每个应用程序进程都有一个 DVM,我们需要一种方法来执行最终代码,否则我们最终会泄漏内存并且电池消耗会激增。

4

4 回答 4

1

您最好的选择是在onPause()每个 Activity 中单独运行清理操作。

finally()Android 不同,当应用程序崩溃时,整个过程就会简单终止。即使是普通的方法onPause()也不会被调用。进程中包含的所有内容(活动、服务、接收器、线程等)都被完全杀死。

于 2013-06-27T09:04:36.127 回答
1

当应用程序/虚拟机崩溃或被杀死时,您不能泄漏内存。在这种情况下,进程消失了,与之相关的任何内存都消失了。

如果您正在谈论分配和释放位于不同进程中的内存,您可以从消费者进程中获取一个 Binder,然后使用Binder.linkToDeath功能在该进程终止时接收通知。

于 2013-06-27T17:17:05.753 回答
1

当您的原始进程无论如何都没有运行时,我不确定您所说的泄漏是什么意思。

我们为处理这种情况所做的还有一件事是拥有一个“看门狗”进程,尽管我们必须在 Android 中运行的本机代码中执行此操作。

在您的情况下,您可能会创建一个服务并通过指定

安卓:进程=“:远程”

清单文件中的标志。现在该服务可以潜在地监视主应用程序进程并在可能的情况下进行一些清理。当然,您需要一种方法让服务进程知道要清理哪些元素。

希望这可以帮助。

于 2013-06-27T17:45:44.333 回答
0

有多种死法:

  1. 被系统杀死。当你在前台时不应该发生,所以确保你关闭东西作为 Android 生命周期的一部分。
  2. 致命异常。您可以使用全局未捕获异常处理程序来处理此问题。请参阅在 Android 中设置全局未捕获异常处理程序的理想方法
  3. 本机崩溃。你对此无能为力。在某些情况下,您可以尝试使用信号处理程序进行恢复,但应用程序将处于非常不确定的状态,因此这通常是一个坏主意并且不太可能工作。

查看其他一些评论,听起来您的设备在相机驱动程序中有一个错误,即使在打开相机的进程已经终止后,它也会导致它保持打开状态。这是一个系统错误——应用程序在崩溃时不应该管理系统资源。(但是,在它得到修复之前,你必须使用你所拥有的。)

于 2013-06-27T19:44:05.517 回答