轉自http://www.eoeandroid.com/forum.php?mod=viewthread&tid=158206
原作者 Android-Sylar
看到很多關於應用退出的問題,今天在這裡為大家簡單總結一下,如果說的不對還望大家見諒。
方法一:System.exit(0)和android.os.Process.killProcess(android.os.Process.myPid()),我想很多人都嘗試過,當關閉多個Activity的時候這兩個方法根本不起作用,原因當然和Activity的堆棧管理有關。
方法二:restartPackage,這種方法會終止一切和這個程式包關聯的,所有共用同一uid的process被kill,所有 的activity會被removed所有建立的服務會停止,還會發一個廣播 Intent.ACTION_PACKAGE_RESTARTED。眾所周知這個方法已經過時,2.2就不起作用了。
- ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
- manager.restartPackage(getPackageName());
- <uses-permission android:name="android.permission.RESTART_PACKAGES"/>
複製代碼
方法三:這個方法是2.2以後取代restartPackage的方法。但是google給的只是一個空殼,這個方法依然不起作用。
- activityManager.killBackgroundProcesses(packageName);
- <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
複製代碼
方法四:建立一個ActivityInstance單例模式來統一管理Activity的退出。這是一個很雞肋的方法,因為它確實有用,但又這麼寫又有點浪費。
具體做法就是寫一個ActivityInstance單例,在每一個activity啟動的時候都調用它的ActivityInstance.addActivity(this);方法,當退出應用時,調用ActivityInstance.exit();方法。
- public void exit(){
- for(Activity at:activityList){
- at.finish();
- }
- System.exit(0);
- }
複製代碼
方法五:發送廣播退出。在需要結束應用時,發送一個特定的廣播,每個Activity收到廣播後關閉。如果不閑麻煩可以這樣做,個人來講還沒有方法四好。
方法六:遞迴退出,在開啟新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞迴關閉。
方法七:退出的時候跳回HOME,一種假的退出方法,但可以退出,該方法只是回到HOME頁而將本身應用虛假退出。
- Intent startMain = new Intent(Intent.ACTION_MAIN);
- startMain.addCategory(Intent.CATEGORY_HOME);
- startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(startMain);
- System.exit(0);
複製代碼
方法八: activityManager.forceStopPackage(PackageName);看到forceStop是不是感覺還挺熟悉的,我們系統設定裡面關閉應用就是調用的這個方法。這個方法可以完全關閉應用程式而且只要一個包名。
不過這個方法是系統隱藏的,我們寫應用的時候在ActivityManager裡是找不到這個方法的。這就涉及到了調用系統隱藏API的方法。下面是通過反射機制來擷取該方法。
- ActivityManager sd = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
- Method method= Class.forName("android.app.ActivityManager")
- .getMethod("forceStopPackage", String.class);
複製代碼
補充:其實Android有自己的記憶體管理機制並不需要我們完全退出本身應用,當使用者按退出鍵的時候使用者回到HOME或其他相關介面即可。在沒有特殊要求的時候虛假退出就可以。