完全退出應用程序是一個基本的不能再基本的功能瞭,每個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);
這個方法是我認為目前最好的退出整個應用的方法,即不會產生內存堆積,退出整個應用的時間也很短,提高瞭用戶體驗,實現起來也很簡單.