最近做的项目恰好需要捕获一个异常来解决一个崩溃问题,于是自己找了网上一个异常捕获的例子,几乎是原封不动的把人家的例子拿来用了。用归用,原理还是要知道的,于是写一篇文章来总结异常捕获涉及的知识点。
原文链接:Android全局捕获崩溃异常记录日志
一、如何捕获一个异常崩溃
1、UncaughtExceptionHandler了解一下
如上图,UncaughtExceptionHandler是Thread类中的一个接口。其中只有一个方法,uncaughtException,当某一线程因未捕获的异常而即将终止时,Java虚拟机会根据Thread的getUncaughtExceptionHandler来获取该线程的UncaughtExceptionHandler并调用uncaughtException方法来处理。如果线程没有明确设置UncaughtExceptionHandler,则会使用默认的异常捕获处理handler与方法。
通过继承此接口,并重写uncaughtException方法就可以来实现我们想要的异常捕获处理操作了。
自定义的异常捕获类通常使用单例模式,在应用初始化阶段通过使用application的上下文注册。类中持有一个默认的异常捕获处理handler,以便于在自定义的异常捕获类出现异常时,可以使用原来默认的类进行处理。同时初始化时使用Thread.setDefaultUncaughtExceptionHandler方法来替换原来的异常捕获类。
2、如何存到本地
知道了捕获异常类的使用方法后,接下来看看如何把崩溃信息保存到本地。
想要保存到本地,总体说来分为两步,一是收集设备信息,二是把信息存储到本地。
1)收集设备信息
通过application上下文获取PackageManager,通过PackageManager获取PackageInfo。PI中有版本名称和版本号。同时还可以通过Build.class.getDeclaredFields来反射获取Build信息。而Build类是android系统提供的,携带设备信息。
2)把信息存到本地
SimpleDateFormat类。此类用于标准化一个想要的时间格式,之后通过java.util.Date()方法获取系统时间作为参数生成format版的时间。
Writer,StringWriter,PrintWriter。String缺省使用16bit,PrintWriter用于写入一串16bit数据,跨平台性更好一些。而Throwable提供的printStackTrace方法要求入参是PrintWriter。而PrintWriter类在构造时需要一个Writer作为入参并持有,之后printStackTrace方法底层最终还是调用了PringtWriter持有的Writer类来进行了写入操作。
Writer类有三个关键方法。write,flush和close。
write方法用于写入字符串,此方法调用后,字符串数据保存在缓冲区中,还未写到目标文件中。
flush方法用于刷新缓冲区,将缓冲区数据保存到目标文件中,
close方法用于关闭此流,关闭时会刷新缓冲区。之后在进行刷新或写入会报IO异常。
File的mkdir和mkdirs方法。mkdir只能建一层目录。若是多层目录需要使用mkdirs。
FileOutputStream类,此类用于Android对SD卡的写入操作。入参为全路径的文件名。
使用时和writer一样。
3、崩溃后重启还是关闭应用如何操作
重启还是关闭要看具体需求。
重启的方式是使用PendingIntent与AlarmManager结合来做到延时唤醒APP。因为android系统不允许两个同名进程存在,所以为了成功重启我们的app,需要先杀死原进程。
4、创建的文件如何在android操作页面进行手动删除
还是通过File加路径来找到文件或目录,之后调用deleteAllFiles方法来实现删除。