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


問題概述:

在Android應用開發中,偶爾會因為測試的不充分導致一些異常沒有被捕獲,這時應用會出現異常並強制關閉,這樣會導致很不好的用戶體驗,為了解決這個問題,我們需要捕獲相關的異常並做處理。

首先捕獲程序崩潰的異常就必須了解一下Java中UncaughtExceptionHandler這個接口,這個接口在Android開發上面也是可以使用的,在API文檔中,我們可以了解到:通過實現此接口,能夠處理線程被一個無法捕獲的異常所終止的情況。如上所述的情況,handler將會報告線程終止和不明原因異常這個情況,如果沒有自定義handler, 線程管理組就被默認為報告異常的handler。 ThreadGroup 這個類就是實現了UncaughtExceptionHandler這個接口,如果想捕獲異常我們可以實現這個接口或者繼承ThreadGroup,並重載uncaughtException方法。

實例:

實現Thread.UncaughtExceptionHandler 接口並復寫uncaughtException(Thread thread, Throwable ex)方法來實現對運行時線程進行異常處理。實現 UncaughtExceptionHandler接口,並在uncaughtException方法中處理異常,這里我們關閉App並啟動我們需要的Activity,下面看代碼:

 

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"); new Thread() { @Override public void run() { Intent intent = new Intent(mContext, MainActivity.class); PendingIntent restartIntent = PendingIntent.getActivity(mContext, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK); AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); android.os.Process.killProcess(android.os.Process.myPid()); } }.start(); } }

在相應的Activity調用下面的方法:

CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(INSTANCE);

我們在Activity中主動拋出下面異常,就會發現應用遇到異常后重啟了,如果不處理的話,應用在遇到異常后就關閉了。需要注意的是,如果設置在Application里面通過startActivity的方式來重啟應用是無法實現我們的需求的。

throw new NullPointerException(); 
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM