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

4
我有一个简单的应用程序,其中包含本地代码。也就是说,一个Activity加上本地代码。
当Activity进入后台时,我会让本地代码继续运行以进行一些处理。问题在于,当操作系统杀死Activity(由于资源不足)时,JNI代码似乎不知道Java环境中发生了什么,并且仍在执行其工作,从而浪费资源。为什么Android只杀死Activity而不是整个进程?在这种情况下,本地代码如何知道Activity已被杀死?OnDestroy()可能无法被调用。
2个回答

2
你可以在一个Android 应用程序中拥有多个活动。当你的活动进入后台时,它们可能会被终止以回收资源。该应用程序通常会保留到手机内存非常低或用户手动杀死应用程序为止。粗略地说,该进程会一直保持到应用程序被杀死。
因为你可以在后台继续处理,所以当你的Activity被重新创建时,你可以检查全局变量的状态,并可能从你上次停止的地方继续进行。
请记住,活动经常被终止,因此没有必要在后台进行处理,但在活动被终止时停止。在这种情况下,你可以在onStop()被调用时停止。

你没有回答这个问题:“为什么Android只关闭Activity而不是整个进程?” 对于NDK,onStop中没有调用任何回调函数,这就是用户所问的。 - RelativeGames
好的,我更新了我的答案,试图更清楚地回答这个问题,谢谢。 - krsteeve
你有 "先销毁活动、应用程序,然后才销毁进程" 的来源吗?我一直很难获取相关信息(请访问此链接了解更多混乱信息)。 - kaay

2
在Android应用程序中,Activity被描述为:
“活动是用户可以执行的单个、聚焦的任务。通常情况下,它是可见的,并且吸引着用户的注意力。它有一个状态机与之相关,描述了当另一个活动变为活动时,它被显示和隐藏的生命周期。操作系统可以随意启动和停止活动 - 只要内存允许。”
此外,Android架构的一个关键点是,活动和服务是可重用的软件组件,不一定与进程具有一对一的关系。在您的活动所在的同一进程中,可能会有一个正在系统中使用的服务。
如果您的代码的JNI部分仍在后台活动,而活动已收到onPause()onStop()onDestroy()通知,那么这只能是因为您没有将这些消息转发给它。系统肯定不知道如何清理本地代码的资源利用,特别是使用new()malloc()分配的内存。除非您释放它,否则它只能在进程终止时恢复。
如果您担心系统没有快速杀死活动,因此持有对本地资源的引用,那么这表明系统没有资源限制。
您可以考虑将应用程序的本地部分实现为服务,并在短时间内自我销毁以避免滞留。

嗨@marko,我有关于将应用程序的本地部分作为服务运行的相关问题。你能建议一下如何做吗?据我所知,在Android上使用意图调用应用程序的本地部分是通过android.app.NativeActivity.class实现的。 - bonchenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接