应用有时会突然得崩溃,这样会比较影响用户体验。如果想要崩溃后重启应用呢。Java中有个UncaughtExceptionHandler的接口, 通过实现此接口,能够处理线程被一个无法捕捉的异常所终止的情况。如上所述的情况,handler将会报告线程终止和不明原因异常这个情况,如果没有自定义handler,线程管理组就被默认为报告异常的handler。
那么创建一个类实现UncaughtExceptionHandler,重写
uncaughtException()方法,当异常发生时会转入该函数来处理。
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
} else {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Log.e(TAG, "error : ", e);
}
if (mIsRestartApp) { // 如果需要重启
Intent intent = new Intent(mContext.getApplicationContext(), mRestartActivity);
AlarmManager mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
//重启应用,得使用PendingIntent
PendingIntent restartIntent = PendingIntent.getActivity(
mContext.getApplicationContext(), 0, intent,
Intent.FLAG_ACTIVITY_NEW_TASK);
mAlarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + mRestartTime,
restartIntent); // 重启应用
}
// 结束应用
((CrashApplication) mContext.getApplicationContext()).removeAllActivity();
}
}
/**
* @param context 上下文
* @param isDebug 是否是Debug模式
* @param isRestartApp 是否支持重启APP
* @param restartTime 延迟重启时间
* @param restartActivity 重启后跳转的 Activity,建议是SplashActivity
*/
public void init(Context context, boolean isDebug, boolean isRestartApp, long restartTime,Class restartActivity) {
mIsRestartApp = isRestartApp;
mRestartTime = restartTime;
mRestartActivity = restartActivity;
init(context, isDebug);
}
public void init(Context context, boolean isDebug) {
mTips = "很抱歉,程序出现异常,即将退出...";
mIsDebug = isDebug;
mContext = context;
// 获取系统默认的 UncaughtException 处理器
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
// 设置该 CrashHandler 为程序的默认处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}
需要应用的application继承CrashApplication
public class CrashApplication extends Application {
private List<Activity> mActivityList;
@Override
public void onCreate() {
super.onCreate();
mActivityList = new ArrayList<>();
}
/**
* 添加单个Activity
*/
public void addActivity(Activity activity) {
// 为了避免重复添加,需要判断当前集合是否满足不存在该Activity
if (!mActivityList.contains(activity)) {
mActivityList.add(activity); // 把当前Activity添加到集合中
}
}
/**
* 销毁单个Activity
*/
public void removeActivity(Activity activity) {
// 判断当前集合是否存在该Activity
if (mActivityList.contains(activity)) {
mActivityList.remove(activity); // 从集合中移除
if (activity != null){
activity.finish(); // 销毁当前Activity
}
}
}
/**
* 销毁所有的Activity
*/
public void removeAllActivity() {
// 通过循环,把集合中的所有Activity销毁
for (Activity activity : mActivityList) {
if (activity != null){
activity.finish();
}
}
//杀死该应用进程
android.os.Process.killProcess(android.os.Process.myPid());
}
}
在application中初始化
UncaughtExceptionHandlerImpl.getInstance().init(this, BuildConfig.DEBUG, true, 0, MainActivity.class);
并在MainActivity初始化方法中将当前对象添加到application中
((App) getApplication()).addActivity(this);
当然,在uncaughtException()方法中,也可以收集手机信息的一些操作,记得获取权限就可以了。