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为什么会导致 ...
随机推荐
- MTK手机最低亮度值修改教程,有效降低亮度[转]
感谢halflover的教程 反编译framework-res.apk 打开\framework-res\res\values\integers.xml 然后找到 <integer name=& ...
- 【VC编程技巧】文件☞2.3CArchive的用法
CArchive 对象提供了一个类型安全缓冲机制CArchive 对象提供了一个类型安全缓冲机制.用于将可序列化对象写入CFile 对象或从中读取可序列化对象.通常,CFile 对象表示磁盘文件:但是 ...
- cf442C Artem and Array
C. Artem and Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 什么是空间复杂度(What is actually Space Complexity ?)
属于空间复杂度(Space Complexity)在很多情况下被错认为是附属空间(Auxiliary Space),下面是附属空间和空间复杂度的定义. 附属空间(Auxiliary Space)是算法 ...
- 使用MutationObserver对象封装一个监听DOM生成的函数
(function(win){ 'use strict'; var listeners = []; var doc = win.document; var MutationObserver = win ...
- 使用python监听、模拟鼠标键盘事件
最近守望职业选手疑似开挂事件挺热闹的,在下小菜一枚,并不能从视频中看出端倪.看了一些关于外挂的讨论,自动点射和压枪只需在鼠标驱动上做些改动即可,自瞄或其他高级功能则需要读内存或修改游戏文件,检测也更容 ...
- IOS深入学习(9)之Objective-C
1 前言 今天我们来解除一篇有关Objective-C的介绍文章,详情如下. 原文链接:http://blog.csdn.net/developer_zhang/article/details/120 ...
- 3DShader之移位贴图(Displacement Mapping)
我们知道法线贴图是只是改了物体的法线属性,用来计算光照,但是并没有改变物体本身的网格.但是移位贴图就不一样了,它会移动物体的顶点.我用移位贴图做了个海洋,好了,上了图再讲: 注意看海的边缘的顶点,已经 ...
- python (3):wxPython打包app,报错
1,打包app报错 如图: 使用py2app,mac下打包成app.异常.程序直接退出. 没有详细的错误信息,client程序直接崩溃了. 2.原因 代码没有几行: #!/usr/bin/python ...
- 【转】iOS开发24:使用SQLite3存储和读取数据
转自:http://my.oschina.net/plumsoft/blog/57626 SQLite3是嵌入在iOS中的关系型数据库,对于存储大规模的数据很有效.SQLite3使得不必将每个对象都加 ...