Android在程序崩潰或者捕獲異常之后重新啟動app


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

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

UnCeHandler具體實現:

 

/**
 * Created by dingchao on 2018/3/23.
 */

/*處理崩潰重疊*/
public class UnCeHandler implements Thread.UncaughtExceptionHandler {
    private Thread.UncaughtExceptionHandler mDefaultHandler;
    public static final String TAG = "CatchExcep";
    AppApplication application;

    public UnCeHandler(AppApplication application){
        //獲取系統默認的UncaughtException處理器
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        this.application = application;
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        if(!handleException(ex) && mDefaultHandler != null){
            //如果用戶沒有處理則讓系統默認的異常處理器來處理
            mDefaultHandler.uncaughtException(thread, ex);
        }else{
            try{
                Thread.sleep(2000);
            }catch (InterruptedException e){
                Log.e(TAG, "error : ", e);
            }
            Intent intent = new Intent(application.getApplicationContext(), MainActivity.class);
            PendingIntent restartIntent = PendingIntent.getActivity(
                    application.getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
            //退出程序
            AlarmManager mgr = (AlarmManager)application.getSystemService(Context.ALARM_SERVICE);
            mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,
                    restartIntent); // 1秒鍾后重啟應用
            application.finishActivity();
        }
    }

    /**
     * 自定義錯誤處理,收集錯誤信息 發送錯誤報告等操作均在此完成.
     *
     * @param ex
     * @return true:如果處理了該異常信息;否則沒有處理返回false.
     */
    private boolean handleException(Throwable ex) {
        if (ex == null) {
            return false;
        }
        //使用Toast來顯示異常信息
        new Thread(){
            @Override
            public void run() {
                Looper.prepare();
                Toast.makeText(application.getApplicationContext(), "很抱歉,程序出現異常,即將退出.",
                        Toast.LENGTH_SHORT).show();
                Looper.loop();
            }
        }.start();
        return true;
    }
}

 

在Application中的onCreate()中

 //設置該CrashHandler為程序的默認處理器
        UnCeHandler catchExcep = new UnCeHandler(this);
        Thread.setDefaultUncaughtExceptionHandler(catchExcep);
    /**
     * Activity關閉時,刪除Activity列表中的Activity對象*/
    public void removeActivity(Activity a){
        list.remove(a);
    }

    /**
     * 向Activity列表中添加Activity對象*/
    public void addActivity(Activity a){
        list.add(a);
    }

    /**
     * 關閉Activity列表中的所有Activity*/
    public void finishActivity(){
        for (Activity activity : list) {
            if (null != activity) {
                activity.finish();
            }
        }
        //殺死該應用進程
        android.os.Process.killProcess(android.os.Process.myPid());
    }

以上可實現的在程序崩潰時提示出現異常即將退出然后重新啟動app,在你重啟之后頁面如果是嵌套的Fragment會出現重疊現象,參考

http://www.cnblogs.com/dingxiansen/p/8628523.html

在嵌套的Activity中重寫一個空方法就ok

 


免責聲明!

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



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