在开发过程中,想必你也一定遇到过这样的问题,当我们的应用发生Crash时异常退出,然后又自动启动跳转到未知页面,此时应用在崩溃前保存的全局变量被重置,用户状态丢失,显示数据错乱。更让我们头疼的是,这种崩溃后重启的情况,并不是每次都会遇到,那么究竟是因为什么呢?
经测试,在 Android 的 API 21 ( Android 5.0 ) 以下,Crash 会直接退出应用,但是在 API 21 ( Android 5.0 ) 以上,系统会遵循以下原则进行重启:
- 包含 Service,如果应用 Crash 的时候,运行着Service,那么系统会重新启动 Service。
- 不包含 Service,只有一个 Activity,那么系统不会重新启动该 Activity。
- 不包含 Service,但当前堆栈中存在两个 Activity:Act1 -> Act2,如果 Act2 发生了 Crash ,那么系统会重启 Act1。
- 不包含 Service,但是当前堆栈中存在三个 Activity:Act1 -> Act2 -> Act3,如果 Act3 崩溃,那么系统会重启 Act2,并且 Act1 依然存在,即可以从重启的 Act2 回到 Act1。
以上内容参考网址:https://www.jianshu.com/p/eb34c5df30e5
解决方法:
public class BuglyCrashHandler implements Thread.UncaughtExceptionHandler {
Thread.UncaughtExceptionHandler exceptionHandler;
List<Activity> activities = new ArrayList<>();
static BuglyCrashHandler instance;
public BuglyCrashHandler(Application application, Thread.UncaughtExceptionHandler handler) {
exceptionHandler = handler;
registerActivityListener(application);
instance = this;
}
@Override
public void uncaughtException(Thread t, Throwable e) {
clearAllActivity();
if (exceptionHandler != null) {
exceptionHandler.uncaughtException(t, e);
}
}
public void clearAllActivity() {
for (Activity activity : activities) {
if (null != activity) {
activity.finish();
}
}
}
public static BuglyCrashHandler getInstance() {
return instance;
}
private void registerActivityListener(Application application) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
/**
* 监听到 Activity创建事件 将该 Activity 加入list
*/
activities.add(activity);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
if (null == activities && activities.isEmpty()) {
return;
}
if (activities.contains(activity)) {
/**
* 监听到 Activity销毁事件 将该Activity 从list中移除
*/
activities.remove(activity);
}
}
});
}
}
}
application中使用方式如下:注意调用顺序,必须在bugly调用之后在调用。
Thread.setDefaultUncaughtExceptionHandler(new BuglyCrashHandler(application, Thread.getDefaultUncaughtExceptionHandler()));