Android怎样才能完全退出程序

来源:互联网 发布:mysql 最近一条记录 编辑:程序博客网 时间:2024/04/27 07:31
  首先说下写这篇博客前的经历,在最近项目中遇到一个非常常见(蛋疼)的问题——OOM,大家都知道OOM的问题主要是加载的图片过多时还有就是引用context没有释放造成的。通过MAT监测,各种分析还是没有看出什么头绪,试着把项目中有可能引用Context的地方都修改了一边,悲剧的是问题依旧在。之所以没有怀疑是图片过多引起的,是因为用的Android-Universal-Image-Loader ,一个比较稳定的加载图片的开源项目。后来根据MAT分析问题一直和UIL有关联,实在没办法死马当活马医,换成了xUtils快速开发框架,最初源于Afinal框架。替换完之后,怀着忐忑的心情测试,十分钟、半小时、OOM没有出现(窃喜),以为问题到此完美解决,继续操作蛋疼的OOM又回来,简直阴魂不散啊。愤怒,气愤,受打击。先不管它了
几天后,心情平静,仔细想想还是要把它解决掉,谁叫咱是完美主义者呢。继续google、百度发现Android Memory Management,
MAT的用法介绍的比较详细。最终发现罪魁祸首还是Context没有释放,导致垃圾无法回收引起的。

下面进入本帖主题,android程序退出的方法很多,不过不在本帖讨论范围之内。我采取的方法是把每个打开的activity放进Stack集合,activity关闭时从Stack集合移除。这也是OOM的根源所在,只是把activity加入到Stack中,而没有移除,就导致了Stack保持了Context引用,虽然activity关闭但是资源没有释放,导致没办法回收。具体解决办法见代码,在onCreate方法中添加的栈中,在onDestroy方法中移除

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);appManager = AppManager.getAppManager();// 把当前activity加入栈中appManager.addActivity(this);}@Overrideprotected void onDestroy() {super.onDestroy();// activity关闭,从栈中移除appManager.finishActivity(this);}/** * 添加Activity到堆栈 */public void addActivity(Activity activity) {if (activityStack == null) {activityStack = new Stack<Activity>();}activityStack.add(activity);}/** * 结束指定的Activity */public void finishActivity(Activity activity) {if (activity != null) {activityStack.remove(activity);activity.finish();activity = null;}}

这就是主要代码,顺便奉上demo一份以供参考

 

0 0
原创粉丝点击