在使用 NDK 将近一年之后,我开始意识到 Android 中的 Process 生命周期与 Activity 生命周期不同。
更具体地说,我的本机库是在 OnCreate 中加载的,但在 onDestroy 中并没有卸载(我什至不知道您是否可以在这里卸载本机库),但是在下一次 OnCreate 时,它仍然是相同的过程,所以所有我的本地库中的全局变量仍然存在,并且它们的状态被保留。Java 中的静态变量也是如此。
这对 Android 2.3 来说非常好,但我最近进入了 Android 4.2.2,我注意到一些非常奇怪的东西。现在可以杀死进程并且只调用 onRestart() 的活动(或者这是我从阅读日志中假设的),老实说这有点奇怪,因为我假设 onCreate 会在进程结束后立即被调用实例化,但他保留不同的选项卡,因为他在“活动”中思考,而不是在进程中思考。所以基本上如果我暂停我的一个应用程序很长一段时间(比如 1 个多小时)然后我返回它,它通常会导致崩溃。
设备日志摘录:
04-14 04:41:34.886 2376 2376 I am_on_paused_called: [0,com.re3.benchmark.AboutActivity]
04-14 05:06:26.128 386 594 I am_proc_died: [0,2376,com.re3.benchmark]
04-14 13:19:44.256 386 538 I am_proc_start:[0,4761,10062,com.re3.benchmark,activity,com.re3.benchmark/.AboutActivity]
04-14 13:19:44.295 386 595 I am_proc_bound: [0,4761,com.re3.benchmark]
04-14 13:19:44.397 386 595 I configuration_changed: 5248
04-14 13:19:44.459 386 595 I am_restart_activity: [0,1115347592,8,com.re3.benchmark/.AboutActivity]
04-14 13:19:44.701 4761 4761 I am_on_resume_called: [0,com.re3.benchmark.AboutActivity]
04-14 13:19:44.881 386 401 I am_activity_launch_time: [0,1115347592,com.re3.benchmark/.AboutActivity,631,631]
04-14 13:19:52.725 386 595 I am_crash: [4761,0,com.re3.benchmark,8961606,java.lang.NullPointerException,NULL,REFramework.java,330]
04-14 13:19:52.725 386 595 I am_finish_activity: [0,1115347592,8,com.re3.benchmark/.AboutActivity,crashed]
04-14 13:19:52.772 386 595 I am_pause_activity: [0,1115347592,com.re3.benchmark/.AboutActivity]
PS:我确实意识到崩溃源于我的代码,但是我的代码并没有真正处理 onRestart 是整个过程中要调用的第一个函数(例如,它绕过了我的本机库初始化,因为我希望首先调用 onCreate )。