当Android Activity被销毁时,如何销毁Native进程

3

我有一个运行在JNI上的Android本地游戏。
当我想退出应用程序时,我调用Activity的Finish方法。Activity被销毁了,但本地进程或内存没有被销毁或清除。

所以,当我再次启动游戏时,游戏的先前状态直接恢复而没有任何本地加载。

如何杀死我的本地进程,以释放资源。


@deduplicator - 这是 Android 将用户可见会话的概念与托管进程的概念分离程度所导致的众所周知的后果。这实际上是一个概念上的问题,不需要任何代码。 - Chris Stratton
3个回答

0

即使活动已经完成,Android本地进程也不会停止。

我知道两种方法来解决这个问题:

1)在您的JNI本地类中创建一个方法来停止本地进程,并从您的活动中调用它。

2)只需调用android.os.Process.killProcess(android.os.Process.myPid());

第二种方法不建议使用,仅在没有其他方法时使用。


0

Android的Activity生命周期与进程的概念高度解耦,这使得在将传统程序架构移植到Android上时变得棘手。

理想情况下,您应该修改本地程序以类似于Activity生命周期的方式进行初始化和销毁例程,以便您可以告诉它停止并清理。任何线程都应该停止运行。尽量将事情清理到调用初始化例程会导致一个干净、功能性的新实例的程度。

更加令人绝望的是,您可以尝试完成()您的活动,然后调用System.exit()。这是强烈不建议的——它会在logcat中留下问题看起来很严重的消息,而且Android甚至可能会迅速地在一个新进程中重新创建您,在这种情况下,您将需要有逻辑来避免重新启动本地引擎。

另一个要考虑的事情是在一个独立的进程中运行本地代码,可以在清单中声明为android组件托管,也可以作为一个独立的可执行文件在其自己的纯本地进程中运行(没有dvm或art),您可以使用管道、unix套接字或可能的共享内存与之通信。


谢谢你的回复 :). 那我想我必须手动完全销毁所有本地内容。我可以使用Activity :: OnDestroy来完成吗? - Vijay V
明白了!!非常感谢 @Chris - Vijay V

-1
你需要知道的一件事是,finish()或者System.exit()只能销毁当前活动。如果你想退出应用程序,你应该首先清除活动堆栈。

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