一、創建一個捕捉崩潰信息的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);
}