android app崩溃后自动重启

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不继承基类等。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值