android應用崩潰重啓

一、創建一個捕捉崩潰信息的BugHandler 類

public class BugHandler implements Thread.UncaughtExceptionHandler {

    private static BugHandler instance;
    private Application application;
    private Thread.UncaughtExceptionHandler mDefaultHandler;
    private boolean exit = false;

    /**
     * 保證只有一個CrashHandler實例
     */
    private BugHandler(Context context) {
        application = (Application) context.getApplicationContext();
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    /**
     * 獲取CrashHandler實例 ,單例模式
     */
    public static BugHandler getInstance(Context context) {
        BugHandler inst = instance;
        if (inst == null) {
            synchronized (BugHandler.class) {
                inst = instance;
                if (inst == null) {
                    inst = new BugHandler(context.getApplicationContext());
                    instance = inst;
                }
            }
        }
        return inst;
    }

    /**
     * 當UncaughtException發生時會轉入該函數來處理
     */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        try {
            StringWriter stringWriter = new StringWriter();
            PrintWriter printWriter = new PrintWriter(stringWriter);
            ex.printStackTrace(printWriter);
            printWriter.close();
            String unCaughtException = stringWriter.toString();//詳細錯誤日誌
            FileUtils.writeErrorLog(unCaughtException, FilePath.LOG_PATH + System.currentTimeMillis() + ".txt");
            Log.e("崩潰信息", unCaughtException);
            //殺死崩潰進程
            ActivityManager.getInstance().AppExit(application);
            //重新啓動
//            Intent intent = new Intent(application, TeaSplashActivity.class);
//            //開啓新進程
//            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//            KeepActiveService.facePay = false;
//            application.startActivity(intent);


			//通過包名直接啓動
            PackageManager packageManager = application.getPackageManager();
            Intent intent =packageManager.getLaunchIntentForPackage("com.test.zy");
            application.startActivity(intent);

        } catch (Exception e) {
            e.printStackTrace();
        }
        mDefaultHandler.uncaughtException(thread, ex);
    }

重啓的方式有兩種:

  • 通過包名
  • 在新的進程中打開啓動頁

注意事項:

1、通過打開引導頁啓動APP需要在新的進程中打開:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

2、殺死之前的進程時,一定要把所有的Activity都關閉,然後在殺死之前的進程。

    public void AppExit(Context context) {
        try {
        	//關閉所有的Activity
            finishAllActivity();
            android.app.ActivityManager activityMgr = (android.app.ActivityManager) context
                    .getSystemService(Context.ACTIVITY_SERVICE);
            activityMgr.killBackgroundProcesses(context.getPackageName());

            System.exit(0);
        } catch (Exception e) {
        }
    }

二、在Application中註冊

    @Override
    public void onCreate() {
        super.onCreate();
    
        BugHandler.getInstance(this);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章