android 退出方案 导致内存泄露
比较奇怪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总加载模式。http://blog.csdn.net/wangshione/article/details/8491098
a、默认是standard:每次new intent。start 跳转都会生成一个新的activity 实例
b、singleTop:本身在栈顶则 调用onNewIntent()
c、singleTask:第一次正常添加到A位置,第二次再添加时比如是A++b位置,清空栈A后的所有实例。不重新创建自己而是调用onNewIntent()
d、singleInstance: 单例单栈模式,新建一个栈给改instance 不重新创建自己而是调用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().
5、加载模式里的statck
参见:
http://www.sjsjw.com/kf_mobile/article/030079ABA017071.asp
android 退出方案 导致内存泄露的更多相关文章
- Android开发 静态static类与static方法持有Context是否导致内存泄露的疑问
简述 在Android开发的过程中,难免会使用单例模式或者静态方法工具类.我们会让它们持有一些外部的Context或者View一般有以下几种情况: 单例模式,类的全局变量持有Context 或 Vie ...
- Andorid 内存溢出与内存泄露,几种常见导致内存泄露的写法
内存泄露,大部分是因为程序的逻辑不严谨,但是又可以跑通顺,然后导致的,内存溢出不会报错,如果不看日志信息是并不知道有泄露的.但是如果一直泄露,然后最终导致的内存溢出,仍然会使程序挂掉.内存溢出大部分是 ...
- [Android Memory] App调试内存泄露之Context篇(上)
转载自:http://www.cnblogs.com/qianxudetianxia/p/3645106.html Context作为最基本的上下文,承载着Activity,Service等最基本组件 ...
- Android下常见的内存泄露 经典
转自:http://www.linuxidc.com/Linux/2011-10/44785.htm 因为Android使用Java作为开发语言,很多人在使用会不注意内存的问题. 于是有时遇到程序运行 ...
- Android大图片导致内存问题小结
在网上看了部分Android中OOM的问题,现在根据理解,做一下笔记. Android OOM 产生的几种原因 1. 程序中使用了太多自己创建的Bitmap. 这种情况通常是最好解决的. 因为你明白你 ...
- Android使用Handler造成内存泄露的分析及解决方法
一.什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用 ...
- MPMoviePlayerController导致statusBar消失,导致内存泄露leak
1.MPMoviePlayerController使statusBar消失 同事写项目时,运行程序总导致statusBar状态条消失,然后就是界面会上移20个像素,导致最下面空白界面,找原因一直不知道 ...
- Android handler 可能会造成内存泄露
Android handler 可能会造成内存泄露 Android Studio 使用 Handler 时: private Handler handler = new Handler(){ @Ove ...
- ThreadLocal是否会导致内存泄露
什么是内存泄露? 维基百科的定义:[内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存],我的理解就是程序失去了对某段内存的控制,那么这段内存就算是泄露了. ThreadLocal为什么会导致 ...
随机推荐
- 开源的Owin 的身份验证支持 和跨域支持
http://identitymodel.codeplex.com/ https://identityserver.github.io/ Windows Identity Foundation 6.1 ...
- Cmake ,Out of Source Build
Out of Source build呢,就是让Cmake产生的临时垃圾文件,不关乎于项目实际本身的文件放到一个目录里,一般我们把这个目录放在项目根目录(也可以认为是根CmakeLists.txt)下 ...
- 11G在线重建索引
SQL> select count(*) from test_idx; COUNT(*) ---------- 19087751 SQL> select segment_name,segm ...
- android 通过TimePickerDialog修改时间
初学android,写了个修改时间的小程序,实现如下: 点击change按钮,弹出时间对话框: 然后点击Done,设置显示时间: 实现方式有两种, 一种是使用showDialog方法,不过此种方法已过 ...
- JVM基础和调优(五)
垃圾回收算法中收集器 接着上面的说,了解了JVM收集垃圾的过程,然后我们看一看收集器. 串行收集器:用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所 ...
- cf494A Treasure
A. Treasure time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- windows puppet manifests 文件维护
初级 puppet windows agent实现简单的msi格式安装包安装及bat文件创建;
- 用c++编写一个不能被继承的类(但是可以在类外部定义该类的对象)
据我们知道,我们只要把类的构造函数和析构函数定义为private类型,那么就不能够在外部建立给类的对象,也就不能以给类为基类进行继承,因为如果继承,建立对象的时候将要调用基类的构造函数,但是因为为pr ...
- Java中的XML操作
1.DOM方式解析(读取)XML文件 待解析(读取)的XML文件,直接放在项目根目录下即可 <?xml version="1.0" encoding="UTF-8& ...
- js iframe 跳转
iframe 页面内操作: //iframe指向指定页面 parent.document.getElementById("hot").src = $("#hidPageU ...