在eoe論壇看到的,總結的很不錯,分享一下。
當應用不再使用時,通常需要關閉應用,可以使用以下兩種方法關閉android應用:
第一種方法:終止當前正在運行的Java虛擬機,導致程序終止System.exit(0);
或者
Runtime.getRuntime().exit(0);
第二種方法:強制關閉與該包有關聯的一切執行
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
manager.restartPackage(getPackageName());
使用這種方式關閉應用程序需要加上權限
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
第三種方式:拋出異常
原理:在程序遇到非檢查異常時,程序退被強制退出,那麼虛擬器也將會被關閉,
所以利用一個非檢查異常,退出程序,但會遇到一個問題,就是強制退出的對話框的出現,是不是很噁心?
其實沒有關係,可以不讓系統彈出對話框,看代碼
public void exit(){
Thread.currentThread().setUncaughtExceptionHandler(new java.lang.Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
//遇到不可抓取的異常會到這裏來,就不會彈出對話框了,完美結局
//在這裏最好讓所有的activity全finish了,也另加入關閉進程的方法
}
});
String meIsNull = null;
//在這裏肯定是空指針異常,遇到異常之後,執行上面的回調代碼,就不會彈出對話框了
meIsNull.equals("空指針");
}
當一個activity創建的時候,把實例傳遞到那個管理activity的集合裏,這個集合一般放在一個可全局訪問的一個類內,
最好那個類繼承Application,然後在menifest的<application>標籤的屬性name上加上自己寫的application類,這個類是單例的。
退出的時候,遍歷集合讓所有的activity finish掉,最後調用關閉進程的那個方法 ,加上
android.os.Process.killProcess(android.os.Process.myPid())
第五種方式:使用遍歷的方式
這種方式比較繁瑣複雜,使用遞歸的方式,沒當打開一個activity的時候都用startActivityForResult(),在onActivityResult()裏接收結果關閉當前的activity,不推薦使用,太繁瑣麻煩。
加上
android.os.Process.killProcess(android.os.Process.myPid())
第六種方式:使用intent的flag實現
原理:在android程序中,當打開一個activity的時候可以傳進去這樣一個flag: Activity.FLAG_ACTIVITY_CLEAR_TOP,
當打開那個新的activity的時候,任務棧裏的所有activity將會被清空,最後只剩下那個新的activity,然後在新的activity
裏使用finish()把自己銷燬了就可以了。加上
android.os.Process.killProcess(android.os.Process.myPid())