背景

安卓应用闪退后总会出现一个“抱歉,App已经停止运行”的弹窗,这样的用户体验并不好。很多大厂的App都去除了这个弹窗,因此本文主要介绍如何去除默认闪退弹窗,以及在闪退时做一些必要的善后工作。

UnCaughtExceptionHandler

UnCaughtExceptionHandler能够在Thread遇到未catch住的Exception而终止前做一些善后工作。但是它无法阻止线程停止运行,线程最后还是要退出。

   Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread thread, Throwable ex) {System.exit(1);}});

去除Dialog

Android系统默认设置了一个UnCaughtExceptionHandler,而弹出闪退弹窗的工作就是在这个handler做的。所以如果要去除弹窗,只要实现一个UnCaughtExceptionHandler并替换掉系统默认的就可以了,代码如下。

public class App extends Application {@Overridepublic void onCreate() {super.onCreate();Thread.setDefaultUncaughtExceptionHandler(new MyUnCaughtExceptionHandler());}class MyUnCaughtExceptionHandler implements Thread.UncaughtExceptionHandler{@Overridepublic void uncaughtException(Thread thread, Throwable ex) {ex.printStackTrace();// do some work hereandroid.os.Process.killProcess(android.os.Process.myPid());System.exit(1);}}
}

以上的替换UnCaughtExceptionHandler的工作是在Application中统一做的,当然你也可以在每一个Activity中做。对于单个Activity还好,当Activity很多的时候就必需实现一个BaseActivity,在BaseActivity中替换,其它Activity要集成BaseActivity。

必要的善后工作

为了处理闪退,提升用户体验,有必要做一些善后工作,主要有几条罗列如下:

异常上报

可以采用邮件或者通过服务器接口上传的方式。两者各有优缺点,邮件方式开发简单,但需要用户额外操作,用户体验较差。如果用上传服务器方式,因为在UnCaughtExceptionHandler中不能打开一个新的线程,所以只能同步请求,在网络情况不好的时候花费时间会较长而阻塞运行。也可能因为网络原因而上报失败。当然总体下来还是上传服务器好一点。具体实现留给读者。

记录日志

将闪退信息存储到文件系统中。不能存到SharedPreferences中,因为打开SP需要使用一个新的线程(Android内部实现),而这在UnCaughtExceptionHandler中,这是不被允许的。

闪退三次清除数据

很多时候是由于后台返回数据错误导致的闪退。如果这些数据被缓存下来,那么用户即使再次打开还是会发生闪退,这时候就只能通过重装或者清除数据的方式才能解决闪退问题,用户体验十分不好。所以在多次闪退后自动清除缓存数据十分必要。具体实现可以参考我的另一篇博客Android实现多次闪退清除数据。不过该博客中使用的是ACRA,一个对UnCaughtExceptionHandler再次封装的开源项目,读者可以将ACRA替换为UnCaughtExceptionHandler来实现。

重新打开App

可以在UnCaughtExceptionHandler中重新打开App或者弹出自定义弹窗。

 class MyUnCaughtExceptionHandler implements Thread.UncaughtExceptionHandler{@Overridepublic void uncaughtException(Thread thread, Throwable ex) {ex.printStackTrace();Intent intent = new Intent(App.this, MainActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);App.this.startActivity(intent);android.os.Process.killProcess(android.os.Process.myPid());System.exit(1);}}

注意setFlags这一步是必需的,因为使用的Context是App的Context,所以必需打开一个新的任务队列,否则打开Activity无法生效,如果你替换Handler是在Activity做的,拿到的Context是Activity的Context,则无需这一步。

注意事项

最主要的注意点我之前已经提到,不要在UnCaughtExceptionHandler中新开一个线程,会抛出异常。

Android去除烦人的默认闪退相关推荐

  1. android 去除启动广告_安卓iOS去除烦人的启动广告,净化手机必备神器

    原标题:安卓iOS去除烦人的启动广告,净化手机必备神器 发现新奇,分享乐趣~ 随着使用手机的时间越长,我们安装的APP也越来越多. 虽然现在的手机性能都能强,APP几乎都是秒开,但许多APP总有开屏广 ...

  2. 火柴人联盟2服务器维护,火柴人联盟2闪退黑屏原因及解决方法汇总

    火柴人联盟2很多玩家已经接触过了,那么游戏闪退黑屏怎么办呢?有不少玩家都遇到了,下面为大家介绍的是游戏闪退黑屏的原因及解决方法,一起来看看吧. 火柴人联盟2闪退黑屏怎么办? 闪退黑屏原因 1.有可能是 ...

  3. [乐意黎原创]2019年最新WinRAR 5.71 中文64位版去除烦人的广告的解决方法

    不知不觉,乐意黎发现用WinRAR打开下载压缩包的同时,会自动弹出广告窗口,有些还不堪入目. 如下图所示: 挺烦人的,研究了很久,用 unlocker 去除了上面安装的版本后,重新安装了2019年8月 ...

  4. adblock去除烦人的广告

    去除烦人的广告: 使用软件adblock 开发版下载地址 https://downloads.adblockplus.org/devbuilds/adblockpluschrome/ 安装,下载下来直 ...

  5. android 9 申请动态权限android.permission.WRITE_EXTERNAL_STORAGE 允许后应用闪退

    问题描述:如题,在调试android 9 高通msm8953平台时,客户反馈应用在允许Manifest.permission.WRITE_EXTERNAL_STORAGE权限后,应用闪退. 从log分 ...

  6. Android Studio 打开Profiler后App闪退

    Android Studio 打开Profiler后App闪退 环境 Android Studio 4.1.1 Android 10 错误信息: 2020-12-24 16:06:21.870 300 ...

  7. Android studio显示百度地图及闪退问题的解决

    Android studio引入百度地图包括解决真机闪退问题 引入百度地图方法 申请百度地图key 百度地图SDK下载即配置 完整代码及部分解释 MainActivity.java AndroidMa ...

  8. 为什么deceit显示无服务器,Deceit进不去怎么办 Deceit游戏崩溃闪退解决方法

    Deceit游戏中很多停止工作.闪退.进不去打不开等都是因为输入法,下面就来分享一下Deceit输入法切换方法,希望能帮大家解决游戏进不去和闪退的问题. Deceit游戏崩溃闪退解决方法 一般情况需要 ...

  9. 仙剑五手游服务器维护,仙剑奇侠传五手游进不去怎么办 仙剑奇侠传五黑屏闪退解决方法...

    仙剑奇侠传五进不去怎么办?看到有些小伙伴在玩游戏时遇到过闪退.黑屏.进不去游戏的问题不知道是怎么回事怎么解决,接下来就和小编一起来看下仙剑奇侠传五黑屏闪退解决方法吧! 仙剑奇侠传五怎么玩不了 1.网络 ...

最新文章

  1. 【Qt】Qt再学习(十五):关于paintEvent、QPainter学习这一个demo就够了
  2. 51Nod 1013 3的幂的和 快速幂 | 乘法逆元 | 递归求和公式
  3. XGBoost、LightGBM与CatBoost算法对比与调参
  4. opengl png图片 qt_Qt资源文件的格式,并用CMake添加Qt资源文件
  5. 寄存器地址和内存地址_通俗易懂和你聊聊寄存器那些事(精美图文)
  6. 【CSON原创】CSS的障眼法:利用border实现图片的翻转
  7. npm安装报错: errno ETIMEDOUT network request toXXX failed, reason: connect ETIMEDOUT
  8. QT中双击mdiArea区域打开文件(监听双击事件)
  9. 唐平中讲座笔记 Reinforcement mechanism design 20171107
  10. Linux下挂载大容量存储
  11. 在CentOS7上安装Mysql,无法启动提示错误:Failed to initialize DD Storage Engine
  12. Java注解详解和自定义注解实战,用代码讲解
  13. CTO创新思维与能力
  14. 头晕和眩晕是怎样的感觉?3件小事来缓解!
  15. python爬虫(7)——获取京东商品评论信息
  16. 【产品设计】用户画像模板
  17. 细胞免疫疗法领军企业药明巨诺在港交所主板上市
  18. [源码和文档分享]JAVA实现基于k-means聚类算法实现微博舆情热点分析系统
  19. UI设计培训分享:UI设计自学好还是报班好?
  20. C语言每日一练——第67天:谁在说谎问题

热门文章

  1. 华为鲲鹏+银河麒麟v10 安装 docker-ce
  2. 全国计算机职称考试excel2003,全国计算机职称考试excel2003题库及答案.pdf
  3. 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash
  4. 《MLB美职棒大联盟》:世界大赛最有价值球员奖
  5. SQL效率低下常见原因汇总
  6. 观剧有感--正者无敌
  7. 主流实时流处理计算框架Flink初体验
  8. 自学编程的好方法,直接省了几万块钱报班,不收藏就可惜了
  9. ITK4.12+VS2015配置详解
  10. 题解 P3387 【【模板】缩点】