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

在开发过程中,想必你也一定遇到过这样的问题,当我们的应用发生Crash时异常退出,然后又自动启动跳转到未知页面,此时应用在崩溃前保存的全局变量被重置,用户状态丢失,显示数据错乱。更让我们头疼的是,这种崩溃后重启的情况,并不是每次都会遇到,那么究竟是因为什么呢?

经测试,在 Android 的 API 21 ( Android 5.0 ) 以下,Crash 会直接退出应用,但是在 API 21 ( Android 5.0 ) 以上,系统会遵循以下原则进行重启:

  • 包含 Service,如果应用 Crash 的时候,运行着Service,那么系统会重新启动 Service。
  • 不包含 Service,只有一个 Activity,那么系统不会重新启动该 Activity。
  • 不包含 Service,但当前堆栈中存在两个 Activity:Act1 -> Act2,如果 Act2 发生了 Crash ,那么系统会重启 Act1。
  • 不包含 Service,但是当前堆栈中存在三个 Activity:Act1 -> Act2 -> Act3,如果 Act3 崩溃,那么系统会重启 Act2,并且 Act1 依然存在,即可以从重启的 Act2 回到 Act1。
     

以上内容参考网址:https://www.jianshu.com/p/eb34c5df30e5

解决方法:

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

application中使用方式如下:注意调用顺序,必须在bugly调用之后在调用。

Thread.setDefaultUncaughtExceptionHandler(new BuglyCrashHandler(application, Thread.getDefaultUncaughtExceptionHandler()));

以上代码参考网址:https://blog.csdn.net/rzleilei/article/details/103337880


http://www.niftyadmin.cn/n/638666.html

相关文章

pycharm可视化网页编程_Python+Pycharm+PyQT5可视化程序设计入门!

一个优秀的程序必须要有友好的可视化交互界面GUI。Python有很多GUI开发的框架&#xff0c;像我之前常用的是自带的Tkinter&#xff0c;对于一些小功能不复杂的程序是绰绰有余的&#xff0c;但对于功能稍微复杂&#xff0c;还是希望找到更简便快捷的GUI设计框架。PyQt是QT的Pyth…

Android中两个HorizontalScrollView联动

参考网址&#xff1a;https://blog.csdn.net/waterseason/article/details/84021963 https://www.iteye.com/blog/gundumw100-1162554 package com.view;import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widge…

c语言程序设计字符组,C语言程序设计:从标准输入设备上输入一个字符串,分别统计其中每个数字、空格、字母及其他字符出现的次...

满意答案kqjmjrlf2004推荐于 2016.01.01采纳率&#xff1a;40% 等级&#xff1a;12已帮助&#xff1a;8550人//.输入一行字符&#xff0c;分别统计出其中字母、空格、数字和其他字符的个数。#include"stdio.h"voidscan(char*a);intword0,space0,num0,nother0;void…

HTML里可以运行C语言吗,我可以直接从GitHub运行HTML文件,而不仅仅是查看其源代码吗?...

您可能要使用raw.githack.com。它支持GitHub&#xff0c;Bitbucket&#xff0c;Gitlab和GitHub要点。的GitHub之前&#xff1a;https://raw.githubusercontent.com/[user]/[repository]/[branch]/[filename.ext]在你的情况下.html扩展后&#xff1a;发展(节流)https://raw.gith…

Android中关于使用Kotlin

在项目的app下的build.gradle文件中 apply plugin:com.android.application//创建项目自带的 //下边三个是使用Kotlin开发用到的 apply plugin:kotlin-android apply plugin: kotlin-android-extensions apply plugin:com.goole.gms.oss.licenses.plugin 会报&#xff1a…

君康人寿2019年排名_2019年上半年保险公司十大数据出炉,保险公司十大排名

原创&#xff1a; 专家组 优选保 今天2019年上半年保险公司排名各项数据出炉了&#xff0c;先公布第一个数据&#xff0c;今年上半年24大行业净利增长率也出来了&#xff0c;保险业净利增值率77.6%&#xff0c;排名各行各业中的第一位。下面来看看2019年上半年保险公司十大排名…

linux open o sync,文件打开方式O_DSYNC、O_RSYNC、O_SYNC

js正则表达式语法1. 正则表达式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的 ...SQL游标遍历数据表DECLARE 资产编号 VARCHAR(50) ,gsid VARCHAR(50) D…

Android中自定义View支持缩放

参考网址&#xff1a;https://blog.csdn.net/zqurapig/article/details/83414389 https://blog.csdn.net/u010648159/article/details/80854797 public class ScaleGestureDemoView extends View {private static final String TAG "ScaleGestureDemoView";privat…