原文链接:http://blog.csdn.net/imzoer/article/details/9380807
前几天在写一个带NFC的应用中发现一个问题:
1. 在activity的OnResume方法中允许nfc的前台发布,也就是说,这之后,刷IC卡会调起当前activity。
2. 在activity的OnPause方法中禁止nfc的前台发布,也就是说,这之后,刷IC卡不会调起当前activity。
3. 在按返回键退出应用时,onBackPressed方法中是如下代码:
@Override
public void onBackPressed() {
finish();
System.exit(0);
}
然而,神奇的事情发生了,应用完全退出了—-这点是符合预期的,但是,当应用退出后,刷IC卡会调起当前activity!
我的个乖乖,百思不得其解,重写了nfc部分代码,发现问题不在这…….
再在activity的各个生命周期中打印log,发现了一个大问题:
system.exit(0)调用了,但是!onpause,onstop和ondestroy方法没有被调用
这里问题就大了,我们都知道,调用finish方法后,activity的生命周期为:
onPause->onStop->onDestroy,但是没有。
发生这种情况的原因只能是操作系统的机制问题:
1. finish方法可能为异步调用,但是system.exit(0)先被调用了,虚拟机已经退出。
2. finish方法中并不调用上述生命周期方法,只是向操作系统表达一种这个activity需要被销毁的意图—我想销毁它,你看什么时候合适。
经过长久的百思不得其解后,安卓开发-Activity中finish() onDestroy() 和System.exit()的区别中终于发现了问题的所在:
Activity.finish()
Call this when your activity is done and should be closed.
在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。
当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放。因为移出了栈,所以当你点击手机上面的“back”按键的时候,也不会再找到这个Activity。
Activity.onDestory()
the system is temporarily destroying this instance of the activity to save space.
系统销毁了这个Activity的实例在内存中占据的空间。
在Activity的生命周期中,onDestory()方法是他生命的最后一步,资源空间等就被回收了。当重新进入此Activity的时候,必须重新创建,执行onCreate()方法。
System.exit(0)
这玩意是退出整个应用程序的,是针对整个Application的。将整个进程直接KO掉。
finish函数仅仅把当前Activity退出了,但是并没有释放他的资源。安卓系统自己决定何时从内存中释放应用程序。当系统没有可用内存到时候,会按照优先级,释放部分应用。
上面也基本验证了我的一个猜测:finish方法只是将当前activity移除栈。至于操作系统何时将onPause->onStop->onDestroy生命周期走一遍,这个要看操作系统的心情。
OK,最后解决一下问题,将System.exit(0)移至onDestroy方法中即可。