這里主要是針對崩潰異常捕獲(runtimeException)
思路就是整個程序都在自己寫的application監(jiān)控下民傻,然后在application里面去監(jiān)控異常的情況呀舔,以及在捕獲異常的時候把當(dāng)前機型和異常的情況提交給服務(wù)端。
直接上代碼:
public class MyApplication extends Application {
public static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
// 全局閃退異常記錄
CrashUtils crashUtils = CrashUtils.getInstance();
crashUtils.init();
}
/** 獲取全局上下文 **/
public static Context getContext() {
return context;
}
}
幫助類:
/**
* Created by Frank on 2016/12/22.
* 崩潰相關(guān)工具類
*/
public class CrashUtils implements Thread.UncaughtExceptionHandler {
private volatile static CrashUtils mInstance;
privateThread.UncaughtExceptionHandler mHandler;
private boolean mInitialized;
privateCrashUtils() {
}
/**單例**/
public static CrashUtils getInstance() {
if(mInstance==null) {
synchronized(CrashUtils.class) {
if(mInstance==null) {
mInstance=new CrashUtils();
}
}
}
return mInstance;
}
/*** 初始化{true: 成功;false: 失敗}**/
public boolean init() {
if(mInitialized)return true;
mHandler= Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
return mInitialized=true;
}
@Override
public void uncaughtException(Thread thread, finalThrowable throwable) {
newThread(newRunnable() {
@Override
public void run() {
CrashModel crashModel =new CrashModel();
crashModel.setDateNow(new SimpleDateFormat("yy-MM-dd HH:mm:ss",Locale.getDefault()).format(newDate()));
crashModel.setDeviceManufacturer(Build.MANUFACTURER);
crashModel.setDeviceModel(Build.MODEL);
crashModel.setAndroidVersion(Build.VERSION.RELEASE);
crashModel.setAndroidSDK(Build.VERSION.SDK_INT);
crashModel.setMessage(throwable.getMessage());
// 接下來就是調(diào)用服務(wù)端的接口去保存閃退的信息
}
}).start();
if(mHandler!=null) {
mHandler.uncaughtException(thread,throwable);
}
}
}
model類:
/**
* Created by Frank on 2016/12/23.
* 全局異常捕獲
*/
public class CrashModel {
/*
************* Crash Log Head ****************
Device Manufacturer: Meizu
Device Model : m3 note
Android Version : 5.1
Android SDK : 22
App VersionName : null
App VersionCode : 0
************* Crash Log Head ****************
*/
privateStringDeviceManufacturer;
privateStringDeviceModel;
privateStringAndroidVersion;
private intAndroidSDK;
privateStringAppVersionName;
private intAppVersionCode;
privateStringMessage;
privateStringDateNow;
// get,set 方法
}
加入注冊信息-->配置文件(AndroidManifest.xml)中
android:name=".MyApplication"
就加在<application 后面
記得給權(quán)限(獲取數(shù)據(jù)话浇,SD卡寫入什么的)
小知識點源碼