我有一个带有本机代码的简单应用程序。也就是一个Activity加原生代码。
当活动进入后台时,我保持本机代码运行以进行一些处理。问题是当活动被操作系统杀死时(由于资源不足),JNI 代码似乎不知道 Java 领域发生了什么并且仍在执行其工作,因此浪费了资源。为什么Android只杀死Activity而不是整个进程?在这种情况下,本机代码如何知道活动已被杀死?OnDestroy() 可能不会被调用。
我有一个带有本机代码的简单应用程序。也就是一个Activity加原生代码。
当活动进入后台时,我保持本机代码运行以进行一些处理。问题是当活动被操作系统杀死时(由于资源不足),JNI 代码似乎不知道 Java 领域发生了什么并且仍在执行其工作,因此浪费了资源。为什么Android只杀死Activity而不是整个进程?在这种情况下,本机代码如何知道活动已被杀死?OnDestroy() 可能不会被调用。
您可以在一个 Android Application中有多个活动。当您的活动进入后台时,可以杀死它们以回收资源。该应用程序通常会一直保留,直到手机内存不足,或者用户手动关闭您的应用程序。粗略地说,该过程一直持续到应用程序被终止。
因为您可以在后台继续处理,所以当您的 Activity 重新创建时,您可以检查全局变量的状态,并可能从您离开的地方继续。
请记住,Activity 经常被杀死,因此在后台进行处理没有太大意义,但在 Activity 被杀死时停止。在这种情况下,您最好在onStop()
被调用时停止。
Android 应用程序中的Activity在文档中描述为
活动是用户可以做的一个单一的、有重点的事情。
它通常是在屏幕上可见并引起用户注意的东西。它与一个状态机相关联,该状态机描述了当另一个活动激活时显示和隐藏的生命周期。操作系统可以根据自己的选择自由启动和停止活动 - 并且内存允许。
此外,Android 架构的一个关键点是活动和服务是可重用的软件组件,不一定与流程具有一对一的关系。在与您的活动相同的进程内可能是系统中另一个进程正在使用的服务。
如果您的代码的 JNI 部分在活动收到通知时仍然在后台处于活动状态onPause()
,那只能是因为您没有将这些消息转发给它。系统当然不知道如何清理本机代码的资源利用率——尤其是使用or分配的内存。除非你释放它,否则它只会在进程终止时恢复。onStop()
onDestroy()
new()
malloc()
如果您担心系统没有足够快地终止您的活动,并且因此持有对本地资源的引用,那么这是一个好兆头,表明系统不受资源限制。
您可能会考虑将应用程序的本机部分实现为服务,并在短期停用后使其自毁。