• Android在程序崩溃或者捕获异常之后重新启动app


    在Android应用开发中,偶尔会因为测试的不充分导致一些异常没有被捕获,这时应用会出现异常并强制关闭,这样会导致很不好的用户体验,为了解决这个问题,我们需要捕获相关的异常并做处理。

    首先捕获程序崩溃的异常就必须了解一下Java中UncaughtExceptionHandler这个接口,这个接口在Android开发上面也是可以使用的,在API文档中,我们可以了解到:通过实现此接口,能够处理线程被一个无法捕获的异常所终止的情况。如上所述的情况,handler将会报告线程终止和不明原因异常这个情况,如果没有自定义handler, 线程管理组就被默认为报告异常的handler。 ThreadGroup 这个类就是实现了UncaughtExceptionHandler这个接口,如果想捕获异常我们可以实现这个接口或者继承ThreadGroup,并重载uncaughtException方法。

    UnCeHandler具体实现:

    /**
     * Created by dingchao on 2018/3/23.
     */
    
    /*处理崩溃重叠*/
    public class UnCeHandler implements Thread.UncaughtExceptionHandler {
        private Thread.UncaughtExceptionHandler mDefaultHandler;
        public static final String TAG = "CatchExcep";
        AppApplication application;
    
        public UnCeHandler(AppApplication application){
            //获取系统默认的UncaughtException处理器
            mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
            this.application = application;
        }
    
        @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);
                }
                Intent intent = new Intent(application.getApplicationContext(), MainActivity.class);
                PendingIntent restartIntent = PendingIntent.getActivity(
                        application.getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
                //退出程序
                AlarmManager mgr = (AlarmManager)application.getSystemService(Context.ALARM_SERVICE);
                mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,
                        restartIntent); // 1秒钟后重启应用
                application.finishActivity();
            }
        }
    
        /**
         * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
         *
         * @param ex
         * @return true:如果处理了该异常信息;否则没有处理返回false.
         */
        private boolean handleException(Throwable ex) {
            if (ex == null) {
                return false;
            }
            //使用Toast来显示异常信息
            new Thread(){
                @Override
                public void run() {
                    Looper.prepare();
                    Toast.makeText(application.getApplicationContext(), "很抱歉,程序出现异常,即将退出.",
                            Toast.LENGTH_SHORT).show();
                    Looper.loop();
                }
            }.start();
            return true;
        }
    }

    在Application中的onCreate()中

     //设置该CrashHandler为程序的默认处理器
            UnCeHandler catchExcep = new UnCeHandler(this);
            Thread.setDefaultUncaughtExceptionHandler(catchExcep);
        /**
         * Activity关闭时,删除Activity列表中的Activity对象*/
        public void removeActivity(Activity a){
            list.remove(a);
        }
    
        /**
         * 向Activity列表中添加Activity对象*/
        public void addActivity(Activity a){
            list.add(a);
        }
    
        /**
         * 关闭Activity列表中的所有Activity*/
        public void finishActivity(){
            for (Activity activity : list) {
                if (null != activity) {
                    activity.finish();
                }
            }
            //杀死该应用进程
            android.os.Process.killProcess(android.os.Process.myPid());
        }

    以上可实现的在程序崩溃时提示出现异常即将退出然后重新启动app,在你重启之后页面如果是嵌套的Fragment会出现重叠现象,参考

    http://www.cnblogs.com/dingxiansen/p/8628523.html

    在嵌套的Activity中重写一个空方法就ok

  • 相关阅读:
    编写高质量代码改善C#程序的157个建议——建议7: 将0值作为枚举的默认值
    编写高质量代码改善C#程序的157个建议——建议6: 区别readonly和const的使用方法
    编写高质量代码改善C#程序的157个建议——建议5: 使用int?来确保值类型也可以为null
    编写高质量代码改善C#程序的157个建议——建议4: TryParse比Parse好
    基于cookie实现用户验证
    页面分页自定义插件
    DOM详习讲解
    HTML标签详细讲解
    Tornado模板配置
    biginteger转Long
  • 原文地址:https://www.cnblogs.com/dingxiansen/p/8628998.html
Copyright © 2020-2023  润新知