zoukankan      html  css  js  c++  java
  • Android 捕获异常并在应用崩溃后重启应用

    问题概述:

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

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

    实例:

    实现Thread.UncaughtExceptionHandler 接口并复写uncaughtException(Thread thread, Throwable ex)方法来实现对运行时线程进行异常处理。实现 UncaughtExceptionHandler接口,并在uncaughtException方法中处理异常,这里我们关闭App并启动我们需要的Activity,下面看代码:

     

    public class CrashHandler implements UncaughtExceptionHandler {
        public static final String TAG = "CrashHandler";
        private static CrashHandler INSTANCE = new CrashHandler();
        private Context mContext;
    
        private CrashHandler() {
        }
    
        public static CrashHandler getInstance() {
            return INSTANCE;
        }
    
        public void init(Context context) {
            mContext = context;
            Thread.setDefaultUncaughtExceptionHandler(this);
        }
    
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            DebugTraceTool.debugTraceE(TAG, "some uncaughtException happend");
    
            new Thread() {
                    @Override
                    public void run() {
                        Intent intent = new Intent(mContext, MainActivity.class);
                        PendingIntent restartIntent = PendingIntent.getActivity(mContext, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
                        AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
                        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent);
                        android.os.Process.killProcess(android.os.Process.myPid());
                    }
                }.start();
        }
    }

    在相应的Activity调用下面的方法:

    CrashHandler crashHandler = CrashHandler.getInstance();
    crashHandler.init(INSTANCE);

    我们在Activity中主动抛出下面异常,就会发现应用遇到异常后重启了,如果不处理的话,应用在遇到异常后就关闭了。需要注意的是,如果设置在Application里面通过startActivity的方式来重启应用是无法实现我们的需求的。

    throw new NullPointerException(); 
    
    
  • 相关阅读:
    每月碎碎念 | 2019.7
    聊聊HTML5中的Web Notification桌面通知
    Python的海龟绘图法小知识
    面向对象是什么意思?通俗易懂
    HTML实体
    gcc错误[Error] ld returned 1 exit status
    Markdown怎么使用制表符TAB键?为什么TAB失灵了?
    力扣题解——2的幂
    Jquery中的Ajax
    7个你可能不认识的CSS单位
  • 原文地址:https://www.cnblogs.com/renhui/p/6163980.html
Copyright © 2011-2022 走看看