歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android怎樣才能完全退出程序

Android怎樣才能完全退出程序

日期:2017/3/1 9:48:11   编辑:Linux編程

首先說下寫這篇博客前的經歷,在最近項目中遇到一個非常常見(蛋疼)的問題——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一份以供參考

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2014年資料/2月/21日/Android怎樣才能完全退出程序

下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm

Copyright © Linux教程網 All Rights Reserved