美文网首页
android5.0以上版本崩溃后重启APP

android5.0以上版本崩溃后重启APP

作者: 来10分钟波比 | 来源:发表于2019-08-14 12:06 被阅读0次

            相信很多小伙伴都会在错误统计后台遇到这样一个错误, 经常有二次崩溃发生在App初始化页面 、 App根页面 、 App主页面等,却知道为什么。其实是android5.0以上的崩溃系统会尝试重启App打开上一次那个页面,但是因为崩溃导致App内的一些数据已经错乱,当你尝试再次重启他当然会二次崩溃。

            好,废话不多说给出解决方案。就是在当App崩溃的时候清除所有页面并且关掉App,这样既然清除所有页面,所以就当然不会出现App会重新启动的情况了。

    一、异常捕获
    public enum SimpleUncaughtExceptionHandlerSingletonimplements Thread.UncaughtExceptionHandler {

    getInstance;

    public static final StringTAG ="simple_activity_manage";

    // 程序的 Context 对象

        private Contextcontext;

    private boolean isDebug;

    private StringmTips;

    // 系统默认的 UncaughtException 处理类

        private Thread.UncaughtExceptionHandlerdefaultHandler;

    public void init(Context context,boolean isDebug) {

    this.isDebug = isDebug;

    this.context = context;

    this.mTips ="很抱歉,程序出现异常,即将退出...";

    // 获取系统默认的 UncaughtException 处理器

            defaultHandler = Thread.getDefaultUncaughtExceptionHandler();

    // 设置该 CrashHandler 为程序的默认处理器

            Thread.setDefaultUncaughtExceptionHandler(this);

    }

    @Override

        public void uncaughtException(Thread thread, Throwable ex) {

    DebugLog.e(TAG,"uncaughtException --> " +"thread = " + (thread !=null ? thread.toString() :"null") +", Throwable = " + (ex !=null ? ex.toString() :"null"));

    if (!handleException(ex) &&defaultHandler !=null) {

    // 如果用户没有处理则让系统默认的异常处理器来处理

                defaultHandler.uncaughtException(thread, ex);

    }else {

    try {

    Thread.sleep(1000);

    }catch (InterruptedException e) {

    }

    //

                SimpleActivityStackSingleton.getInstance.finishAllActivity();

    // 杀死了整个进程,这时候活动所占的资源也会被释放

    //System.exit(0);

    //杀死该应用进程

                android.os.Process.killProcess(android.os.Process.myPid());

    }

    }

    /**

    * 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成

    *

        * @param ex

        * @return true:如果处理了该异常信息;否则返回 false

    */

        private boolean handleException(final Throwable ex) {

    if (ex ==null) {

    return false;

    }

    // 使用 Toast 来显示异常信息

            new Thread() {

    @Override

                public void run() {

    Looper.prepare();

    Toast.makeText(context, getTips(ex), Toast.LENGTH_LONG).show();

    Looper.loop();

    }

    }.start();

    return true;

    }

    private String getTips(Throwable ex) {

    if (exinstanceof SecurityException) {

    if (ex.getMessage().contains("android.permission.CAMERA")) {

    mTips ="请授予应用相机权限,程序出现异常,即将退出.";

    }else if (ex.getMessage().contains("android.permission.RECORD_AUDIO")) {

    mTips ="请授予应用麦克风权限,程序出现异常,即将退出。";

    }else if (ex.getMessage().contains("android.permission.WRITE_EXTERNAL_STORAGE")) {

    mTips ="请授予应用存储权限,程序出现异常,即将退出。";

    }else if (ex.getMessage().contains("android.permission.READ_PHONE_STATE")) {

    mTips ="请授予应用电话权限,程序出现异常,即将退出。";

    }else if (ex.getMessage().contains("android.permission.ACCESS_COARSE_LOCATION") || ex.getMessage().contains("android.permission.ACCESS_FINE_LOCATION")) {

    mTips ="请授予应用位置信息权,很抱歉,程序出现异常,即将退出。";

    }else {

    mTips ="很抱歉,程序出现异常,即将退出,请检查应用权限设置。";

    }

    }

    return mTips;

    }

    }

    Activity列表管理器

    enum SimpleActivityStackSingleton {

    getInstance;

    private static final StringTAG ="SimpleActivityStackSingleton";

    private final ListactivityStack =new ArrayList<>();

    /**

    * 添加单个Activity

    */

        public void addActivity(Activity activity) {

    if (!activityStack.contains(activity)) {

    activityStack.add(activity);

    }

    }

    /**

    * 销毁单个Activity

    */

        public void removeActivity(Activity activity) {

    if (activityStack.contains(activity)) {

    activityStack.remove(activity);

    }

    }

    /**

    * 销毁所有的Activity

    */

        public void finishAllActivity() {

    DebugLog.e(TAG,"finishAllActivity -->");

    // TODO : 注意, 最后一个 Activity 是出现异常的 Activity, 不能finish(), 否则在不杀死进程之前直接启动 APP 会卡住.

            for (int i =activityStack.size() -2; i >=0; i--) {

    Activity activity =activityStack.get(i);

    DebugLog.e(TAG,"finishAllActivity --> " + activity.getClass().getSimpleName());

    activity.finish();

    }

    activityStack.clear();

    }

    }

    Activity生命周期管理

    public abstract class SimpleBaseActivityextends AppCompatActivity {

    private static final StringTAG ="simple_activity_manage";

    @Override

        protected void onCreate(@Nullable Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    DebugLog.e(TAG, getClass().getSimpleName() +"_onCreate");

    SimpleActivityStackSingleton.getInstance.addActivity(this);

    }

    @Override

        protected void onResume() {

    super.onResume();

    DebugLog.e(TAG, getClass().getSimpleName() +"_onResume");

    MobclickAgent.onResume(this);

    }

    @Override

        protected void onPause() {

    super.onPause();

    DebugLog.e(TAG, getClass().getSimpleName() +"_onPause");

    MobclickAgent.onPause(this);

    }

    @Override

        protected void onDestroy() {

    super.onDestroy();

    DebugLog.e(TAG, getClass().getSimpleName() +"_onDestroy");

    SimpleActivityStackSingleton.getInstance.removeActivity(this);

    }

    }

    如上:思路就是在app捕获到崩溃的时候清空app中的activity列表容器,并且退出app。就不会再重启了。

    文中如有什么不清楚的可以联系我,我可以更文。

    相关文章

      网友评论

          本文标题:android5.0以上版本崩溃后重启APP

          本文链接:https://www.haomeiwen.com/subject/nccgjctx.html