一直以來,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,然後測試一下是否會重啓