针对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重启相关推荐

  1. Swift 伪原子并发同步代码引起 DispatchGroup.leave() 方法不平衡调用导致 App 崩溃的解决

    文章目录 问题现象 问题分析 1. 失踪的真机崩溃日志 2. Xcode 通过崩溃日志快速定位出错代码位置 3. 并发代码不平衡调用 DispatchGroup.leave() 的根本原因 4. &q ...

  2. 02.Android崩溃Crash库之App崩溃分析

    目录总结 01.抛出异常导致崩溃分析 02.RuntimeInit类分析 03.Looper停止App就退出吗 04.handleApplicationCrash 05.native_crash如何监 ...

  3. Android app 崩溃 Crash 分析(一)

    如何收集崩溃日志的总结 收集崩溃时的基本信息 进程(前台进程还是后台进程) 线程(是否是 UI 线程) 崩溃堆栈(具体崩溃在系统的代码,还是我们自己的代码里面) 崩溃堆栈类型(Java 崩溃.Nati ...

  4. 由Asset中的double free引发的Android系统及APP崩溃问题分析

    前言 这个问题在来小米之前就遇到并解决过,当时的解决方案与朴老师的初步解决方案一样,本文在之前的初步分析结果之上进一步进行了深入分析,最终得出了当前看起来相对合理并符合原来架构设计的最终方案. 文中引 ...

  5. 解决 Android WebView 多进程导致App崩溃

    应用场景 应用内有两个位置用到WebView加载页面,具体处理逻辑不能通用.分别扩展了WebView了.应用内独立页面使用Fragment来展示,(采用单Activity架构).应用提供切换语言功能. ...

  6. android 内存播放视频播放器,视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题...

    原标题:视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题 我们的流媒体服务器现在都已经支持H.265编码视频的播放,流媒体播放器EasyPlayer就是目前比较稳 ...

  7. Android 利用Intent启动另一个app应用时,一个崩溃的问题

    今天在做Launcher项目时,需要显示所有app,并且点击调用,在调用时,遇到一个崩溃问题.在此做一记录. 问题:在本地写的一个demo应用,里面有一个bug,点击这个demo应用,应用崩溃.在la ...

  8. android app崩溃后自动重启

    1.偶然发现项目因为一场崩溃后,自动重启到上一界面.因为未知原因,重启后fragment显示有误,需要杀死进程后才能正常适应app.悲剧的是,因为马上就重启进程 了,导致LOG中看不到异常原因.非常不 ...

  9. 我的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 ...

最新文章

  1. CNN中,1X1卷积核到底有什么作用呢?
  2. 让你的名字在百度排名前列
  3. 黑电平校正、FPN校正、平场校正、白平衡校正
  4. Java泛型详解:<T>和Class<T>的使用,泛型类
  5. 菜鸟技术专家胡斌:技术架构的战略和战术原则
  6. Detect to Track and Track to Detect
  7. JavaEE中使用绝对目录的说明
  8. 用于将带有查询字符串的复杂对象传递到Web API方法的自定义模型绑定器
  9. python input文字_Python-8-讓使用者輸入文字/input()用法
  10. c语言基础编程题山东科技大学,C语言练习题〔山东科技大学吐血整理〕.doc
  11. WinForm中为按钮添加键盘快捷键,超简单,亲测有效
  12. 设计开发-API代付系统/自动代付系统
  13. 计算机信息处理技术的易混淆知识点,计算机等级考试二级VisualFoxPro备考策略、考试题型与解题技巧与易混淆的知识点...
  14. 基于gmapping的激光slam导航
  15. 微信开发者工具测试小程序
  16. 优化滚动的一个小技巧:scroll-snap-type
  17. c语言中方阵对角线的和程序,c语言程序 1、方阵求出主对角线上元素之和;2、辅对角线上元素之积;3方阵中最大的元素...
  18. echarts 双Y轴,双X轴, 折线图折点,折点与直方对应
  19. linux 网络 指示灯 亮,Linux网络子系统中GRO的实现
  20. 智能车竞赛·通过虚拟示波器实现电机PID调参

热门文章

  1. 滋补品微商怎么通过微博引流?微商们如何抓住其中得到商机?
  2. 从零打造视频播放网站(2)-后端接口设计篇
  3. 如何从Eclipse官网下载我们想要的版本
  4. 2019年工资个税计算方法来了!累计预扣法详解!
  5. 攻防世界-Misc题目练习
  6. Android网络编程常用的三种方法
  7. 对github的中间人攻击
  8. 我对《无为无不为》的感想
  9. [衣裳饰品]谈谈西装、手工西装和西装定制_时尚资讯_天涯论坛
  10. 几美元激动了她的心,天真的小学生