Android_完美退出應用方法

在網上找了好幾個完美退出app的方法,都看了一下,最後選擇了一個靠譜的ExitApplication來繼承Application來退出應用,但是其中也遇到很多問題。

先貼一段網上都有的代碼:ExitApplication.java

package com.biceng.utils;

import java.util.LinkedList;
import java.util.List;

import android.app.Activity;
import android.app.Application;

public class ExitApplication extends Application {

	private static ExitApplication exitApplication;
	private List<Activity> activityList = new LinkedList<Activity>();

	private ExitApplication() {
		super();
	}

	public static ExitApplication getInstance() {
		if (exitApplication == null) {
			return new ExitApplication();
		} else {
			return exitApplication;
		}
	}

	public void addActivity(Activity activity) {
		activityList.add(activity);
	}

	public void exit() {
		for (Activity activity : activityList) {
			activity.finish();
		}
		System.exit(0);
	}

}

這是一個最基本的單例模式寫的,思路就是將所有打開的activity,都加載到一個LIst裏面,最後要退出時,將LIst中的activity都finish()掉。

再每個activity的oncreate()方法裏都加上一句:ExitApplication.getInstance().addActivity(this);

在想退出時,退出方法裏調用:ExitApplication.getInstance().exit();

這樣一看,這個方法其實一點問題都沒有,但是,在實測中,總是出現退出不了的問題。

問題困擾了我不少時間,也在網上找了很多類似的代碼,修修改改,均沒有效果。

最後無意間,看到了一個大神的blog中,也有一段類似的代碼,細心研究了一番,他的代碼更嚴謹,增加了線程同步的概念,提醒系統回收垃圾等。

大神的代碼:

package com.biceng.utils;

import java.util.LinkedList;
import java.util.List;

import android.app.Activity;
import android.app.Application;

public class ExitApplication extends Application {

	private static ExitApplication instance;
	private List<Activity> activityList = new LinkedList<Activity>();

	private ExitApplication() {
	}

	public synchronized static ExitApplication getInstance() {
		 if (null == instance) {     
	            instance = new ExitApplication();     
	        }     
	        return instance; 
	}

	public void addActivity(Activity activity) {
		activityList.add(activity);
	}

	public void exit() {
		try {     
            for (Activity activity : activityList) {     
                if (activity != null)     
                    activity.finish();     
            }     
        } catch (Exception e) {     
            e.printStackTrace();     
        } finally {     
            System.exit(0);     
        }   
	}
	@Override     
    public void onLowMemory() {     
        super.onLowMemory();         
        System.gc();   //告訴系統回收  
    } 

}

然後,再去系統測試,果然可行。不由得告訴同事,困擾了幾天的bug,終於解決了。


附上大神的blog地址:

http://blog.csdn.net/way_ping_li





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章