比较奇怪android没有给出一个统一的退出接口,网上查了很多材料也出现了一些错误,在此记录一下,遇到的,与总结的。


1、常见概念,方法

finish()

通知结束当前activity实例,finish后会调用onDestroy() 但是并没有马山释放该activity实例,只是标记可以释放,并且从back statck中移除,具体何时释放内存是由gc自动判断释放。

system.exit(0) 

这个方法表面上看是结束退出,实际使用时也是退出当前的activity而已。内存应该是立马释放了,没有测过。调用exit(0) 会黑屏一会。


2、list退出方案bug

杀进程无效,用 List<Activity> activityList 在每个activity的oncreat方法里 activityList.add(this); 退出时用一个循环全部finish是可以退出的。

但是实际项目中内存泄露了。开始的时候内存泄露非常郁闷,因为接触java不久,一直以为这语言是自动释放内存的,但是事实上并没有想像中那么智能还不如c++直接全部都让编程者自己来。最后用MAT( Memory Analyzer tool )内存查询工具定位到内存泄露是发生在 List<Activity> activityList 上才想到。是这个list把各个activity钳位住了,释放不了。

为了逻辑上的清晰。阐述下项目应用,底部一个导航栏四个图标,两个主界面,一个设置,一个后退。两个主要界面及子界面不断切换后内存泄露卡死。用DDMS 的update heap 查看到内存一直增长没有稳定在一个区间。手动点cause gc 后内存无法降低,查了好久。


3、加载方式与Intent.Flag 

介于list方式会内存溢出,换成Stack activityStack;  手动控制进栈出栈,应该是可以,会太麻烦了,和自己手动finish就一样了。以为开始的时候内存泄露不懂用mat 查泄露。参考了很多办法,阅读了一些材料。

查阅到了android的加载4总加载模式。

 a、默认是standard:每次new intent。start 跳转都会生成一个新的activity 实例

singleTop:本身在栈顶则 调用onNewIntent() 

singleTask:第一次正常添加到A位置,第二次再添加时比如是A++b位置,清空栈A后的所有实例。不重新创建自己而是调用onNewIntent() 

不重新创建自己而是调用onNewIntent(); 点击back没有该实例


FLAG_ACTIVITY_CLEAR_TOP: 第一次正常添加到A位置,第二次再添加时比如是A++b位置,清空栈A后的所有实例。先杀死原来的自己,在onCreat自己。

FLAG_ACTIVITY_NEW_TASK:实例放入新栈


4、可用方案

登入界面,引导界面手动跳转时finish()

主页设置为singleInstance (或者 FLAG_ACTIVITY_CLEAR_TOP) 。退出都是先退到主页,再点一次退出  finish()。(不用exit,黑屏影响用户体验)


因为这里是有两个主页所以两个都设置为FLAG_ACTIVITY_CLEAR_TOP的话,登入启动的第一个主页是可以正常退出,第二个主页会先退到第一个主页再退出。所以在二号主页要添加一句对一号页的finish().