android自定義廣播實現app完全退出

完全退出應用程序是一個基本的不能再基本的功能瞭,每個APP都會有這個功能,在java中這個功能很容易就實現瞭,這裡就不多說瞭,但在android裡,卻好像沒有那麼容易,查閱瞭網上相關的資料和博客,大概有以下幾種方法:

1.利用 PackageManager關閉所有本程序相關的進程,有人說2.2以上此法就失效瞭,沒有親自試過,不枉下斷言,感興趣的可以自己試.

2.利用java的exit()方法+android的killProcess(int pid); 小米3上親測不可用,隻能關掉當前Activity,可能在其它android系統中可以,但至少說明不通用.

3.創建一個List將所有新啟動的Activity都加入到此列表中,在退出應用時,執行遍歷此集合,將所有Activity關閉,可以勉強實現退出整個應用,缺點:代價太大,要在整個應用的生命同期中維護一個List,極易產生內存堆積,處理不好就是內存溢出,親測會有內存堆積和溢出的現象,在小米1上溢出的更頻繁.而且如果未關閉的Activity比較多的話,退出時會明顯有一個卡的過程,用戶體驗不好.

以上三種方法要不是不通用,要不就是不好用,看到過一篇博客,推薦用廣播的方式去關閉整個應用程序,思路就是為所有的Activity創建一個父類,隻要在父類中註冊一個自定義關閉應用廣播即可實現,仔細想瞭一下這個方法是可行的,隻要在基類中動態註冊一個廣播就可實現這個功能.以下是自己寫的一個退出應用的demo,具體到不同的應用中,隻要稍加調整就可以使用:

//自定義一個廣播接收器,用來接收應用程序退出廣播.
public class ExitAppReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        if (context != null) {

            if (context instanceof Activity) {

                ((Activity) context).finish();
            } else if (context instanceof FragmentActivity) {

                ((FragmentActivity) context).finish();
            } else if (context instanceof Service) {

                ((Service) context).stopSelf();
            }
        }
    }
}

//應用程序中所有Activity的基類
public class BaseActivity extends Activity  {
	
	private ExitAppReceiver exitReceiver = new ExitAppReceiver();
       //自定義退出應用Action,實際應用中應該放到整個應用的Constant類中.
        private static final String EXIT_APP_ACTION = "com.micen.exit_app";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		registerExitReceiver();
	}

	private void registerExitReceiver() {

          	IntentFilter exitFilter = new IntentFilter();
		exitFilter.addAction(EXIT_APP_ACTION);
		registerReceiver(exitReceiver, exitFilter);
	}

	private void unRegisterExitReceiver() {

		unregisterReceiver(exitReceiver);
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		unRegisterExitReceiver();
	}

	@Override
	protected void onStart() {
		super.onStart();
	}

	@Override
	protected void onStop() {
		super.onStop();
	}
}
    
    //最後在要退出App的方法中添加以下發送廣播代碼即可.
    Intent intent = new Intent();
    intent.setAction(EXIT_APP_ACTION);
    sendBroadcast(intent);

這個方法是我認為目前最好的退出整個應用的方法,即不會產生內存堆積,退出整個應用的時間也很短,提高瞭用戶體驗,實現起來也很簡單.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *