UncaughtExceptionHandler是全局捕獲異常的,為app意外中止的提供一些處理的方法。只需要實(shí)現(xiàn)UncaughtExceptionHandler,重寫一些方法,就可以做到把異常信息保存在本地或者上傳到服務(wù)器。
https://blog.csdn.net/qdjdeveloper/article/details/78130226
1、定義java類實(shí)現(xiàn)系統(tǒng)接口UncaughtExceptionHandler,具體代碼如下:
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.SystemClock;
import com.blankj.utilcode.util.TimeUtils;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Date;
/**
* Created by wyn on 2018/9/29.
*/
public class CrashHandler implements Thread.UncaughtExceptionHandler {
//文件夾目錄
? ? private static final StringPATH = Environment.getExternalStorageDirectory().getPath() +"/projectName/crash_log/";
//文件名
? ? private static final StringFILE_NAME ="crash";
//文件名后綴
? ? private static final StringFILE_NAME_SUFFIX =".txt";
//上下文
? ? private ContextmContext;
private static class CrashHandlerInstance {
private static final CrashHandlerINSTANCE =new CrashHandler();
}
private CrashHandler() {
}
public static CrashHandler getInstance() {
return CrashHandlerInstance.INSTANCE;
}
@Override
? ? public void uncaughtException(Thread t, Throwable e) {
//導(dǎo)出異常信息到SD卡
? ? ? ? dumpExceptionToSDCard(e);
//上傳異常信息到服務(wù)器
? ? ? ? uploadExceptionToServer(e);
//延時(shí)1秒殺死進(jìn)程
? ? ? ? SystemClock.sleep(2000);
android.os.Process.killProcess(android.os.Process.myPid());
}
public void init(Context context) {
//將當(dāng)前實(shí)例設(shè)為系統(tǒng)默認(rèn)的異常處理器
? ? ? ? Thread.setDefaultUncaughtExceptionHandler(this);
//獲取Context,方便內(nèi)部使用
? ? ? ? mContext = context.getApplicationContext();
}
/**
* 導(dǎo)出異常信息到SD卡
*
? ? * @param ex
? ? */
? ? private void dumpExceptionToSDCard(Throwable ex) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return;
}
//創(chuàng)建文件夾
? ? ? ? File dir =new File(PATH);
if (!dir.exists()) {
dir.mkdirs();
}
String time = TimeUtils.date2String(new Date());
//以當(dāng)前時(shí)間創(chuàng)建log文件
? ? ? ? File file =new File(PATH +FILE_NAME + time +FILE_NAME_SUFFIX);
try {
//輸出流操作
? ? ? ? ? ? PrintWriter pw =new PrintWriter(new BufferedWriter(new FileWriter(file)));
//導(dǎo)出手機(jī)信息和異常信息
? ? ? ? ? ? PackageManager pm =mContext.getPackageManager();
PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
pw.println("發(fā)生異常時(shí)間:" + time);
pw.println("應(yīng)用版本:" + pi.versionName);
pw.println("應(yīng)用版本號(hào):" + pi.versionCode);
pw.println("android版本號(hào):" + Build.VERSION.RELEASE);
pw.println("android版本號(hào)API:" + Build.VERSION.SDK_INT);
pw.println("手機(jī)制造商:" + Build.MANUFACTURER);
pw.println("手機(jī)型號(hào):" + Build.MODEL);
ex.printStackTrace(pw);
//關(guān)閉輸出流
? ? ? ? ? ? pw.close();
}catch (Exception e) {
}
}
/**
* 上傳異常信息到服務(wù)器
*
? ? * @param ex
? ? */
? ? private void uploadExceptionToServer(Throwable ex) {
// TODO: 添加異常上傳服務(wù)器
? ? }
}
2、在application對(duì)CrashHandler 初始化,在oncreate方法中。
CrashHandler.getInstance().init(this);