Android UncaughtExceptionHandler捕获crash的全局异常
Android App在crash的时候可以做一些操作,比方说记录异常文件并上传到服务器,或者接入类似腾讯bugly的异常分析平台,一个简单的做法就是前者,实现的代码如下:
package com.duoyin.stock.activity; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.Environment; import android.os.Process; import android.util.Log; import com.duoyin.stock.util.HAUtils; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by yeh on 2016/7/4. */ public class CrashHandler implements Thread.UncaughtExceptionHandler {private static final String TAG = CrashHandler.class.getName(); private static final boolean DEBUG = true; private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/yehTest/log/";// log path private static final String FILE_NAME = "crash"; private static final String FILE_NAME_SUFFIX = ".trace"; private static CrashHandler sInstance = new CrashHandler(); // 系统默认的异常处理(默认情况下,系统会终止当前的异常程序) private Thread.UncaughtExceptionHandler mDefaultCrashHandler; private Context mContext; private CrashHandler() {}public static CrashHandler getInstance() {return sInstance; }public void init(Context context) {mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); mContext = context.getApplicationContext(); }@Override public void uncaughtException(Thread thread, Throwable ex) {try {HAUtils.showMsg(mContext, "呃呃~~程序crash了~~~"); // 导出当前的错误信息到sdcard dumpExceptionToSDCard(ex); uploadExceptionToServer(); } catch (Exception e) {e.printStackTrace(); }ex.printStackTrace(); if (mDefaultCrashHandler != null) {mDefaultCrashHandler.uncaughtException(thread, ex); } else {Process.killProcess(Process.myPid()); }}/** * 上传异常到服务器 */ private void uploadExceptionToServer() {}/** * 导出信息到SDCard * * @param ex */ private void dumpExceptionToSDCard(Throwable ex) {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {if (DEBUG) {Log.w(TAG, "sdcard unmounted,skip dump exception"); }}File dir = new File(PATH); if (!dir.exists()) {dir.mkdirs(); }long current = System.currentTimeMillis(); String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current)); File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX); if (!file.exists()) {file.mkdir(); }try {PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println(time); // 导出手机信息 dumpPhoneInfo(pw); pw.println(); // 导出异常的调用栈信息 ex.printStackTrace(pw); } catch (Exception e) {Log.e(TAG, "dump crash info failed"); }}private void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException {//应用的版本名称和版本号 PackageManager pm = mContext.getPackageManager(); PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES); pw.print("App Version: "); pw.print(pi.versionName); pw.print('_'); pw.println(pi.versionCode); //android版本号 pw.print("OS Version: "); pw.print(Build.VERSION.RELEASE); pw.print("_"); pw.println(Build.VERSION.SDK_INT); //手机制造商 pw.print("Vendor: "); pw.println(Build.MANUFACTURER); //手机型号 pw.print("Model: "); pw.println(Build.MODEL); //cpu架构 pw.print("CPU ABI: "); pw.println(Build.CPU_ABI); } }
另外因为是全局操作需要在Application中调用如下的操作即可:
CrashHandler crashHandler = CrashHandler.getInstance(); crashHandler.init(this);
参考了任玉刚博客:
http://blog.csdn.net/singwhatiwanna/article/details/17289479
Android UncaughtExceptionHandler捕获crash的全局异常相关推荐
- 《全局异常捕获》劝劝潘子吧,别再用trycatch来处理异常了
人世仙家本自殊,何须相见向中途.惊鸿瞥过游龙去,漫恼陈王一事无. 嗨,大家好,我是洛神,性别男.一个来自快乐星球的程序员. 欢迎大家专注我的公众号[程序员洛神],不仅分享技术,还会分享生活趣事.体育. ...
- Android UncaughtExceptionHandler 全局异常监控
2019独角兽企业重金招聘Python工程师标准>>> 一.全局捕获异常 为了解决这样的问题,我们需要能够及时的捕获异常,但要捕获的地方是在太多,因此,我们需要进行全局性的异常捕获, ...
- Android开发之全局异常捕获
Android开发之全局异常捕获 [转载请注明出处]本文出自付小华的博客 http://blog.csdn.net/klxh2009 今晨谷歌正式发布Android 8.0,新版本的Android O ...
- Android 全局异常捕获DefaultUncaughtExceptionHandler与Cockroach
前言 Android中虽然可以通过设置 Thread.setDefaultUncaughtExceptionHandler来捕获全局的所有线程的异常,但主线程抛出异常时仍旧会导致activity闪退, ...
- android bug监控,Android UncaughtExceptionHandler 全局异常监控
一.全局捕获异常 为了解决这样的问题,我们需要能够及时的捕获异常,但要捕获的地方是在太多,因此,我们需要进行全局性的异常捕获,那么如何捕获全局异常呢? 答案是UncaughtExceptionHand ...
- android捕获全局异常,并对异常做出处理
2019独角兽企业重金招聘Python工程师标准>>> 在做项目时,经常会把错误利用异常抛出去,这样在开发时就可以通过手机抛的异常排查错误,很方便.但是当程序开发完毕,版本稳定,需要 ...
- app闪退后重启_安卓APP崩溃(crash)后重新启动,捕获全局异常重启APP
在安卓应用中,如果是偶发性bug导致APP崩溃,APP可能会直接闪退或者白屏,用户体验不太好,我们可以在application中捕获到全局异常,然后再进行处理. 首先创建一个MainApplicati ...
- Android全局异常捕获
Android全局异常捕获 参考文章: (1)Android全局异常捕获 (2)https://www.cnblogs.com/heweiquan/p/10973201.html 备忘一下.
- 在Android中自定义捕获Application全局异常,可以替换掉系统的强制退出对话框(很有参考价值与实用价值)
在Android中自定义捕获Application全局异常,可以替换掉系统的强制退出对话框(很有参考价值与实用价值) 参考文章: (1)在Android中自定义捕获Application全局异常,可以 ...
最新文章
- 大龄程序员刚迈过了 35 岁这个“坎儿”,和大家说点儿心里话
- VisualStudioCode插件下载
- MySQL数据类型合集
- Spring框架—IoC容器
- nginx安装和配置实例
- 当html里语义化,HTML5语义化
- @程序员,沟通这项核心技能你掌握了多少?
- 服务器项目部署工具,通过工具SecureCRTPortable将项目部署到服务器上
- 计算机组成原理感想,学习计算机组成原理的感想
- 雅虎免费邮箱片头动画:Liam系列
- windows10清理鼠标右键菜单
- java整数最大_Java 整数最大值
- PL3376C-ASEMI电源管理芯片PL3376C
- 学习心得《稻盛和夫经营学》的读后感2300字
- Android广告SDK的Package
- 陶泓达:3.23黄金,原油,白银操作策略!
- 膜蛋白巯基氧化还原修饰红细胞膜/红细胞膜包裹共载藤黄酸和吲哚菁绿白蛋白纳米粒相关研究
- wmi服务或wmi提供程序_什么是WMI提供程序主机(WmiPrvSE.exe),为什么使用那么多的CPU?...
- 求解非齐次线性方程组算法
- 在Word简历中插入照片(图片)
热门文章
- resulttype和resultMap区别详解
- 判断火车票座位python代码_12306 火车票监控Python代码,12306python, import u
- Kafka分区消息积压排查指南
- 无聊游戏随笔--学院篇
- 游戏建模软件大PK,没想到赢家却是他
- google zxing二维码库 初始
- 使用qq邮箱作为找回密码发件邮箱。报错:参数或变量中有语法错误。 服务器响应为:mail from address must be same as authorization u
- Linux内核手帐之内存管理源码分析(一)
- SpringIOC手动装配(注入):构造器注入,静态工厂注入,实例化工厂注入
- 基于React的企业级实战项目的宜居商场