比较奇怪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().