Android处理崩溃的一些实践
来源:互联网 发布:ch是什么软件 编辑:程序博客网 时间:2024/05/20 10:23
对于任何程序来说,崩溃都是一件很难避免的事情,当然Android程序也不例外。在Android程序中,引起崩溃的多属于运行时异常或者错误,对于这些异常我们很难做到类似Checked Exception那样显式捕获,因而最终导致了程序崩溃。本文讲介绍一些如何处理崩溃的实践,比如收集崩溃的stacktrace,甚至如何避免出现程序已停止的对话框。
如何收集崩溃信息收集崩溃信息,可以更好的修复问题,增强程序的稳定性。Android中的崩溃收集沿用了Java的收集机制,实现起来比较简单。
1.实现UncaughtExceptionHandler我们需要实现UncaughtExceptionHandler接口中的uncaughtException方法。该方法体中最常见的操作就是读取崩溃的stacktrace信息,然后上报到服务器数据便于开发者分析。实现代码如下:
除此之外,还建议携带以下信息发送到服务器,帮助更快定位和重现问题。
- 设备唯一ID(基于IMEI或者Android ID等),方便根据用户提供的id,查找崩溃的stacktrace
- 设备语言与区域 方便重现
- 应用的版本号
- 设备的系统版本
- 设备类型,如平板,手机,TV等
- 崩溃发生的时间等
注册默认的异常处理就是最后的一步,很简单,通常建议放在Application的onCreate方法中进行。
验证
当我们刻意触发一个NullPointerException时,过滤日志adb logcat | grep SimpleUncaughtExceptionHandler类似如下信息,则说明成功了。
不出现应用崩溃对话框
在Android崩溃的时候,我们都会看到类似这样的对话框
然而,实际上有些情况下是不需要展示这个对话框的,一个常用的例子,我的程序中一个不太重要的推送服务采用了单独的进程,当这个进程崩溃时,实际上是可以允许不让用户感知的。
如果我们采取主进程仍弹出对话框,其他进程不弹出的策略,那么我们的问题,可以总结成如下三个
- 如何判断进程为主进程还是其他进程,或者某个进程
- 如何在某些进程不弹出应用崩溃对话框
- 如何在主进程弹出崩溃对话框
既然问题来了,我们就开动挖掘机深挖吧。
进程判定进行进程判定也比较容易,首先我们需要获得进程名
判断主进程,则对比进程名是否和包名相同即可
判断为某个进程,在mainifest这样这样声明
其对应的完整进程名为com.droidyue.avoidforceclosedemo:service,我们判断可以使用如下代码
不弹框的处理
不弹框的需要做的就是不调用Android默认的异常处理,当异常出现时,收集完信息,执行进程kill即可。
主进程保持弹窗的处理
想要保持弹窗也比较容易,就是调用Android默认的异常处理。
首先需要获得Android默认的异常处理,在设置自定的异常处理之前,将Android默认处理保存起来。如下是在自定义异常处理的构造方法中获取Android默认处理
然后在异常处理方法uncaughtException中调用如下方法
注意,如果你的应用崩溃后,不调用Android默认的异常处理,也不进行杀死进程,则进程处于不可交互,即UI点击无响应状态。
0 0
- Android处理崩溃的一些实践
- Android处理崩溃的一些实践
- Android处理崩溃的一些实践
- Android处理崩溃的一些实践
- 关于Android程序崩溃的一些记录
- Android 如何处理崩溃的异常
- Android 程序崩溃后的处理
- Android中 崩溃异常的处理
- Android应用崩溃的应急处理
- 优雅的处理Android崩溃(一)
- 优雅的处理Android崩溃(二)
- Android 处理崩溃异常
- Android崩溃处理
- Android崩溃处理
- Android崩溃处理
- Android崩溃处理
- Android处理崩溃异常
- Android 崩溃日志处理
- 黎曼zeta函数 详细介绍 (英文版)
- Caffe: gflag编译出现问题汇总
- MultiViewPager项目的使用
- Python生成随机数的方法
- Mac 使用SSH TUNNEL
- Android处理崩溃的一些实践
- Linux ./configure --prefix 命令是什么意思?
- nodejs 常用 index
- MacDown语法小结
- 常见几种二分查找
- 相机(摄像头)获取到的图片自动旋转90度解决办法
- Ios使用正则表达式验证手机号码
- 【MVC5】5.创建一个连接字符串和SQL Server LocalDB工作
- angular1中使用track by优化ng-repeat效率