当前位置: 移动技术网 > IT编程>移动开发>Android > Android App Crash之后如何禁止Activity重启

Android App Crash之后如何禁止Activity重启

2018年12月10日  | 移动技术网IT编程  | 我要评论

十八罗汉山森林公园,昆山二手房信息,审车时间

针对crash,android默认的处理方式是,退出app、弹一个提示框。

/** 
 * 初始化 
 *  
 * @param context 
 */  
public void init(context context) {  
    mcontext = context;  
    // 获取系统默认的uncaughtexception处理器  
    mdefaulthandler = thread.getdefaultuncaughtexceptionhandler();  
    // 设置该crashhandler为程序的默认处理器  
    thread.setdefaultuncaughtexceptionhandler(this);  
}

/** 
 * 当uncaughtexception发生时会转入该函数来处理 
 */  
@override  
public void uncaughtexception(thread thread, throwable ex) {
    if (!handleexception(ex) && mdefaulthandler != null) {
        //如果用户没有处理则让系统默认的异常处理器来处理
        mdefaulthandler.uncaughtexception(thread, ex);
    } else {
        try {
            // 暂停3秒
            thread.sleep(3000);
        } catch (interruptedexception e) {
            log.e(tag, "error : ", e);
        }
        // 退出程序
        android.os.process.killprocess(android.os.process.mypid());
        system.exit(1);
    }
}

/** 
 * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 
 *  
 * @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(mcontext, "程序出现异常,即将退出~", toast.length_short).show();
            looper.loop();
        }
    }.start();

    return true;  
}

自定义crash提示

但是问题也随之而来,自定义crashhandler在退出app之后,会重启当前奔溃的activity,如果奔溃的是launchactivity,那么会不断奔溃、重启、奔溃、重启……当然,也不用担心进入死循环(系统有做限制),但是体验极差。

于是对比logcat日志:

系统默认handler

i/activitymanager( 1238): process com.netease.mail.oneduobaohydrid.debug (pid 2780) has died
w/activitymanager( 1238): scheduling restart of crashed service com.netease.mail.oneduobaohydrid.debug/com.netease.mail.oneduobaohydrid.service.commonservice in 1000ms
……
i/activitymanager( 1238): start proc com.netease.mail.oneduobaohydrid.debug for service com.netease.mail.oneduobaohydrid.debug/com.netease.mail.oneduobaohydrid.service.commonservice: pid=2819 uid=10054 gids={50054, 9997, 1028, 1015, 3003} abi=x86

自定义handler

i/activitymanager( 1238): process com.netease.mail.oneduobaohydrid.debug (pid 2993) has died
w/activitymanager( 1238): scheduling restart of crashed service com.netease.mail.oneduobaohydrid.debug/com.netease.mail.oneduobaohydrid.service.commonservice in 64000ms
……
i/activitymanager( 1238): start proc com.netease.mail.oneduobaohydrid.debug for activity com.netease.mail.oneduobaohydrid.debug/com.netease.mail.oneduobaohydrid.activity.mainactivity: pid=3030 uid=10054 gids={50054, 9997, 1028, 1015, 3003} abi=x86

相同点:crash之后app对应的process都被杀死,然后都安排重启service。

不同点:自定义crashhandler,存在一个由activitymanager启动对应activity的系统行为。

多放查阅资料,发现app crash之后系统会重新启动task栈顶的activity,具体请自行google!

解决方法是:在杀死app对应process之前,结束掉task栈中所有的activity。

/** 
 * 当uncaughtexception发生时会转入该函数来处理 
 */  
@override  
public void uncaughtexception(thread thread, throwable ex) {
    if (!handleexception(ex) && mdefaulthandler != null) {
        //如果用户没有处理则让系统默认的异常处理器来处理
        mdefaulthandler.uncaughtexception(thread, ex);
    } else {
        try {
            // 暂停3秒
            thread.sleep(3000);
        } catch (interruptedexception e) {
            log.e(tag, "error : ", e);
        }
        // 结束所有activity
        oneapplication.finishallactivities();
        // 退出程序
        android.os.process.killprocess(android.os.process.mypid());
        system.exit(1);
    }
}

核心代码:oneapplication.finishallactivities();

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网