一、创建一个捕捉崩溃信息的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);
}