Android 實現bug捕捉並重啓應用

一直以來,Android 的閃退處理起來都十分麻煩,用戶可能不知道什麼情況,App就沒有了,做一個全局的捕捉機制,上傳錯誤信息,或進行提醒,這將對用戶十分友好。這裏我就簡單實現一下,App遇到bug自動重啓並提醒用戶。

異常處理類

 

package com.example.testrestart;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Looper;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Toast;

/**
 * 自定義異常處理類
 * <p>
 * Created by Mouzhai on 2017/4/11.
 */

public class MyExceptionHandler implements Thread.UncaughtExceptionHandler {

    private Context context;
    private Thread.UncaughtExceptionHandler mUncaughtExceptionHandler;
    private static MyExceptionHandler instance = new MyExceptionHandler();

    private MyExceptionHandler() {
    }

    /**
     * 獲取CrashHandler實例 ,單例模式
     */
    public static MyExceptionHandler getInstance() {
        return instance;
    }

    public void init(Context context) {
        this.context = context;
        mUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();// 獲取系統默認的異常處理類
        Thread.setDefaultUncaughtExceptionHandler(this);

    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {

        if (!handleException(ex) && mUncaughtExceptionHandler != null) {
            // 若是用戶沒有設置異常處理,則讓系統默認的類來處理異常
            mUncaughtExceptionHandler.uncaughtException(thread, ex);
        } else {
            // 進行自定義的方法
            // 設置定時任務,1秒後重啓此 App
            Intent intent = new Intent(context, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            PendingIntent restartIntent = PendingIntent.getActivity(context, 0, intent, 0);
            AlarmManager mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            mAlarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent);
            // 移除當前任務
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
        }
    }

    /**
     * 對於拋出的異常進行處理,例如打印日誌、發送文件給服務器等等
     *
     * @param ex 導致崩潰的異常
     * @return 若在此處理了異常,則返回 true,否則返回 false
     */
    private boolean handleException(Throwable ex) {
        if (ex == null) {
            return false;
        }
        // 此處可以進行一些更爲複雜的請求,例如打印崩潰信息日誌等
        // 這裏彈出提示信息
        new Thread() {
            @Override
            public void run() {
                Looper.prepare();
                Log.e("TAGs","打印日誌");
                Toast.makeText(context,"很抱歉,程序崩潰了,一秒鐘後重啓。",Toast.LENGTH_LONG).show();
                Looper.loop();
            }
        }.start();
        SystemClock.sleep(1000);
        return true;
    }
}

自定義application

 

package com.example.testrestart;

import android.app.Application;

public class AppContext extends Application {
    protected static AppContext instance;

    public void onCreate() {
        super.onCreate();
        instance = this;
        // 程序崩潰時觸發線程  以下用來捕獲程序崩潰異常
       MyExceptionHandler.getInstance().init(this);
    }
}

記得在AndroidManifest.xml中註冊一下

 

測試

然後自己隨便建立一個Activity,寫個點擊事件,寫個除以0的bug,然後測試一下是否會重啓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章