Android怎样才能完全退出程序

  首先说下写这篇博客前的经历,在最近项目中遇到一个非常常见(蛋疼)的问题——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方法中移除

 @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		appManager = AppManager.getAppManager();
		// 把当前activity加入栈中
		appManager.addActivity(this);
	}

	@Override
	protected 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值