Android解决应用崩溃后重启的问题,以及与bugly的冲突

在某些手机或者平板上,android程序崩溃后,系统会根据堆栈信息强行把应用重新拉起。但是这种强行重启应用,会一些数据缺失的问题,造成二次崩溃,这样的体验是十分不好的。

所以我的目标就是崩溃后不要重新拉起应用。

如何解决崩溃后重新的问题,可以参见下面的文章,本文不做过多的描述,清空activityStack即可。

Android 解决应用崩溃后重启的问题 

核心代码如下:

public class BuglyCrashHandler implements Thread.UncaughtExceptionHandler {

   
    List<Activity> activities = new ArrayList<>();
    static BuglyCrashHandler instance;

    public BuglyCrashHandler(Application application) {
        exceptionHandler = handler;
        registerActivityListener(application);
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        clearAllActivity();
    }

    public void clearAllActivity() {
        for (Activity activity : activities) {
            if (null != activity) {
                activity.finish();
            }
        }
    }

    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调用如下方法:

Thread.setDefaultUncaughtExceptionHandler(new BuglyCrashHandler(application);

一般这样做是没有问题的,但是如果引入了bugly,那就有问题了。bugly也使用的是Thread.setDefaultUncaughtExceptionHandler(this)方式,则只会有一个生效。BuglyCrashHandler会和bugly默认的UncaughtExceptionHandler冲突,这就是本文要解决的重点。

所以我们可以简单的改一下,使用自定义的UncaughtExceptionHandler,然后在uncaughtException中昨晚自己的事情后,再把异常转交给bugly的UncaughtExceptionHandler。如下:

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) {
       
        if (exceptionHandler != null) {
            exceptionHandler.uncaughtException(t, e);
        }
        clearAllActivity();
         android.os.Process.killProcess(android.os.Process.myPid());
    }

    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()));

但是实际验证下来,程序还是会被重新启动。于是乎,继续debug验证,发现bugly的异常处理又阻断效果。

 @Override
    public void uncaughtException(Thread t, Throwable e) {
        Log.i("lxl", "uncaughtException before:thread:" + Thread.currentThread().getName());
        if (exceptionHandler != null) {
            exceptionHandler.uncaughtException(t, e);
        }
        //后面的代码都不会被执行
        clearAllActivity();
        android.os.Process.killProcess(android.os.Process.myPid());
        Log.i("lxl", "uncaughtException after");
    }

是怀疑是bugly的异常处理中,应该调用了杀死进程一类的操作,所以导致后面的代码没有执行。于是稍微改了下,最终代码如下,完美解决了程序崩溃后重启与bugly的冲突。

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);
                    }
                }
            });
        }
    }
}

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要捕获 Android 应用程序的异常并重启应用程序,可以使用 Thread.UncaughtExceptionHandler 接口。该接口用于捕获未捕获的异常,并在捕获异常后重启应用程序。 下面是一个简单的示例代码,用于设置应用程序的 UncaughtExceptionHandler: ``` public class MyApplication extends Application implements Thread.UncaughtExceptionHandler { @Override public void onCreate() { super.onCreate(); Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) { // 捕获异常并重启应用程序 Intent intent = new Intent(getApplicationContext(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000, pendingIntent); System.exit(2); } } ``` 在上述示例代码中,我们创建了一个自定义的 Application 类,并实现 Thread.UncaughtExceptionHandler 接口。在 onCreate() 方法中,我们将当前线程的默认 UncaughtExceptionHandler 设置为该应用程序的 UncaughtExceptionHandler。 当应用程序中有未捕获的异常时,会调用 uncaughtException() 方法。在该方法中,我们创建一个 Intent 对象,用于启动 MainActivity,然后使用 PendingIntent 将该 Intent 对象封装为一个闹钟事件,并在 1 秒钟后启动该事件。最后,我们调用 System.exit() 方法退出应用程序。 这样,当应用程序中发生未捕获的异常时,应用程序将自动重启

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失落夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值