Android 捕獲異常并在應用崩潰后重啟應用

linshizhuce 8年前發布 | 6K 次閱讀 安卓開發 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

 

 本文由用戶 linshizhuce 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!