Android防止App崩溃的,Android App Crash之后如何禁止Activity重启
针对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();
Android防止App崩溃的,Android App Crash之后如何禁止Activity重启相关推荐
- Swift 伪原子并发同步代码引起 DispatchGroup.leave() 方法不平衡调用导致 App 崩溃的解决
文章目录 问题现象 问题分析 1. 失踪的真机崩溃日志 2. Xcode 通过崩溃日志快速定位出错代码位置 3. 并发代码不平衡调用 DispatchGroup.leave() 的根本原因 4. &q ...
- 02.Android崩溃Crash库之App崩溃分析
目录总结 01.抛出异常导致崩溃分析 02.RuntimeInit类分析 03.Looper停止App就退出吗 04.handleApplicationCrash 05.native_crash如何监 ...
- Android app 崩溃 Crash 分析(一)
如何收集崩溃日志的总结 收集崩溃时的基本信息 进程(前台进程还是后台进程) 线程(是否是 UI 线程) 崩溃堆栈(具体崩溃在系统的代码,还是我们自己的代码里面) 崩溃堆栈类型(Java 崩溃.Nati ...
- 由Asset中的double free引发的Android系统及APP崩溃问题分析
前言 这个问题在来小米之前就遇到并解决过,当时的解决方案与朴老师的初步解决方案一样,本文在之前的初步分析结果之上进一步进行了深入分析,最终得出了当前看起来相对合理并符合原来架构设计的最终方案. 文中引 ...
- 解决 Android WebView 多进程导致App崩溃
应用场景 应用内有两个位置用到WebView加载页面,具体处理逻辑不能通用.分别扩展了WebView了.应用内独立页面使用Fragment来展示,(采用单Activity架构).应用提供切换语言功能. ...
- android 内存播放视频播放器,视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题...
原标题:视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题 我们的流媒体服务器现在都已经支持H.265编码视频的播放,流媒体播放器EasyPlayer就是目前比较稳 ...
- Android 利用Intent启动另一个app应用时,一个崩溃的问题
今天在做Launcher项目时,需要显示所有app,并且点击调用,在调用时,遇到一个崩溃问题.在此做一记录. 问题:在本地写的一个demo应用,里面有一个bug,点击这个demo应用,应用崩溃.在la ...
- android app崩溃后自动重启
1.偶然发现项目因为一场崩溃后,自动重启到上一界面.因为未知原因,重启后fragment显示有误,需要杀死进程后才能正常适应app.悲剧的是,因为马上就重启进程 了,导致LOG中看不到异常原因.非常不 ...
- 我的Android进阶之旅------gt;Android APP终极瘦身指南
首先声明,下面文字转载于: APK瘦身实践 http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ APP ...
最新文章
- CNN中,1X1卷积核到底有什么作用呢?
- 让你的名字在百度排名前列
- 黑电平校正、FPN校正、平场校正、白平衡校正
- Java泛型详解:<T>和Class<T>的使用,泛型类
- 菜鸟技术专家胡斌:技术架构的战略和战术原则
- Detect to Track and Track to Detect
- JavaEE中使用绝对目录的说明
- 用于将带有查询字符串的复杂对象传递到Web API方法的自定义模型绑定器
- python input文字_Python-8-讓使用者輸入文字/input()用法
- c语言基础编程题山东科技大学,C语言练习题〔山东科技大学吐血整理〕.doc
- WinForm中为按钮添加键盘快捷键,超简单,亲测有效
- 设计开发-API代付系统/自动代付系统
- 计算机信息处理技术的易混淆知识点,计算机等级考试二级VisualFoxPro备考策略、考试题型与解题技巧与易混淆的知识点...
- 基于gmapping的激光slam导航
- 微信开发者工具测试小程序
- 优化滚动的一个小技巧:scroll-snap-type
- c语言中方阵对角线的和程序,c语言程序 1、方阵求出主对角线上元素之和;2、辅对角线上元素之积;3方阵中最大的元素...
- echarts 双Y轴,双X轴, 折线图折点,折点与直方对应
- linux 网络 指示灯 亮,Linux网络子系统中GRO的实现
- 智能车竞赛·通过虚拟示波器实现电机PID调参