Android活动生命周期和JNI本机代码生命周期

时间:2013-09-17 03:46:37

标签: android android-activity java-native-interface lifecycle

我有一个简单的应用程序与本机代码。也就是说,Activity加上本机代码。

当活动进入后台时,我会保持本机代码运行以进行一些处理。问题是当活动被操作系统杀死时(由于资源不足),JNI代码似乎不知道Java领域发生了什么,仍然在做它的工作,因此浪费了资源。为什么Android只会杀死Activity而不是整个进程?在这种情况下,本机代码如何知道活动被杀死了?可能无法调用OnDestroy()。

2 个答案:

答案 0 :(得分:2)

您可以在一个Android Application中拥有多个活动。当您的活动进入后台时,可以杀死它们以回收资源。应用程序通常保持不变,直到手机内存运行非常低,或者用户手动杀死您的应用程序。大致说来,这个过程一直持续到应用程序被杀死。

由于您可以在后台继续处理,因此在重新创建活动时,您可以检查全局变量的状态,也可以选择上次停止的位置。

请记住,活动经常被杀死,所以没有太多意义在后台进行处理,但在活动被杀死时停止。在这种情况下,您可以在调用onStop()时停止。

答案 1 :(得分:2)

Android应用程序中的Activity在文档中描述为

  

活动是用户可以做的一件重点事。

通常是屏幕上可见的内容并引起用户的注意。它与一个状态机相关联,该状态机描述了当另一个活动变为活动时显示和隐藏的生命周期。操作系统可自由地启动和停止活动,因为它选择了 - 并且内存允许。

此外,Android架构的一个关键点是活动和服务是可重用的软件组件,并不一定与流程有一对一的关系。在同一过程中,您的活动可能是系统中另一个进程正在使用的服务。

如果您的代码的JNI部分在活动收到onPause()onStop()onDestroy()通知时仍在后台处于有效状态,那么只能是因为您没有将这些消息转发给它。系统当然不知道如何清理本机代码的资源利用率 - 特别是使用new()malloc()分配的内存。除非您将其释放,否则只有在流程终止时才能恢复。

如果你担心的是你的活动没有被系统杀死得足够快,并且因此保留了对原生土地资源的引用,那么这是一个很好的信号,表明系统不受资源限制。

您可以考虑将应用程序的原生部分实现为Service,并在短时间内自行销毁。