概述
1.偶然发现项目因为一场崩溃后,自动重启到上一界面。因为未知原因,重启后fragment显示有误,需要杀死进程后才能正常适应app。悲剧的是,因为马上就重启进程
了,导致LOG中看不到异常原因。非常不好调试。
2.经过查资料得知,这些都是google的一种策略,当app崩溃后,会自动根据栈里面的activity的顺序,重启栈顶activity。
3.有的手机保留了这个功能,有的手机估计是定制的原因,会屏蔽掉这个功能,导致以前我没有注意这个现象。
4.避免无故重启带来的bug,让app崩溃后自动关闭。
1)、首先在在application 自定义异常处理类。
// 以下用来捕获程序崩溃异常
Thread.setDefaultUncaughtExceptionHandler(restartHandler); // 程序崩溃时触发线程
registerActivityListener();//activity管理类
2)、在自定义的处理类中关闭栈中的activity,然后杀死当前app进程。此处result 是崩溃异常的信息。
public Thread.UncaughtExceptionHandler restartHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
//下面为调试用的代码,发布时可注释
Writer info = new StringWriter();
PrintWriter printWriter = new PrintWriter(info);
ex.printStackTrace(printWriter);
Throwable cause = ex.getCause();
while (cause != null) {
cause.printStackTrace(printWriter);
cause = cause.getCause();
}
printWriter.flush();
printWriter.close();
String result = info.toString();
Log.i("sss",result);
for (int i=0;i<activities.size();i++){
Log.i("sss",activities.get(i).getLocalClassName());
if (activities.get(i)!=null)
activities.get(i).finish();
}
android.os.Process.killProcess(android.os.Process.myPid());
}
};
3)、activty管理,一般方法是在activity的基类中,在oncreate中 把activity添加到list数组中,再在ondestry中删除remove这个activity。
此处采用atcivity生命回调监听方法,在android14版本以上有效。
private void registerActivityListener() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
registerActivityLifecycleCallbacks(new 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);
}
}
});
}
}
每个activity,从创建到销毁都会回调这个方法,可以避免有的activity不继承基类等。
最后
以上就是忧伤航空为你收集整理的android app崩溃后自动重启的全部内容,希望文章能够帮你解决android app崩溃后自动重启所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复