Android 捕獲異常并在應用崩潰后重啟應用
問題概述:
在Android應用開發中,偶爾會因為測試的不充分導致一些異常沒有被捕獲,這時應用會出現異常并強制關閉,這樣會導致很不好的用戶體驗,為了解決這個問題,我們需要捕獲相關的異常并做處理。
首先捕獲程序崩潰的異常就必須了解一下Java中UncaughtExceptionHandler這個接口,這個接口在Android開發上面也是可以使用的,在API文檔中,我們可以了解到:通過實現此接口,能夠處理線程被一個無法捕獲的異常所終止的情況。如上所述的情況,handler將會報告線程終止和不明原因異常這個情況,如果沒有自定義handler, 線程管理組就被默認為報告異常的handler。 ThreadGroup 這個類就是實現了UncaughtExceptionHandler這個接口,如果想捕獲異常我們可以實現這個接口或者繼承ThreadGroup,并重載uncaughtException方法。
實例:
實現Thread.UncaughtExceptionHandler 接口并復寫uncaughtException(Thread thread, Throwable ex)方法來實現對運行時線程進行異常處理。實現 UncaughtExceptionHandler接口,并在uncaughtException方法中處理異常,這里我們關閉App并啟動我們需要的Activity,下面看代碼:
/***
@Description: 捕獲未處理的崩潰并進行相關處理的機制 --- 單例模式
*/
public class CrashHandler implements UncaughtExceptionHandler {
public static final String TAG = "CrashHandler";
private static CrashHandler INSTANCE = new CrashHandler();
private Context mContext;
private CrashHandler() {
}
public static CrashHandler getInstance() {
return INSTANCE;
}
public void init(Context context) {
mContext = context;
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
DebugTraceTool.debugTraceE(TAG, "some uncaughtException happend");
ex.printStackTrace();
new Thread() {
@Override
public void run() {
Looper.prepare();
new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false).setMessage("程序崩潰了,重新啟動?")
.setNeutralButton("確定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(mContext.getApplicationContext(), MainActivity.class);
PendingIntent restartIntent = PendingIntent.getActivity(mContext.getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
//退出程序
AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); // 1秒鐘后重啟應用
android.os.Process.killProcess(android.os.Process.myPid());
}
}).setNegativeButton("退出", new OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
System.exit(0);
}
}).create().show();
Looper.loop();
}
}.start();
}
}
</code></pre>
在相應的Activity調用下面的方法:
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(INSTANCE);
我們在Activity中主動拋出下面異常,就會發現應用遇到異常后重啟了,如果不處理的話,應用在遇到異常后就關閉了。
throw new NullPointerException();
來自:http://www.cnblogs.com/renhui/p/6163980.html