编写应用时,总会有没有捕获到的异常,android应用崩溃时,默认情况下会弹出一个dialog,对于用户来说是一个很不友好的提示,那么如何捕获全局异常,然后自己来处理这个异常呢?
step1:
package com.bsi.crashdemo;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Build;
import android.os.Process;
import android.widget.Toast;
/**
* Created by QianMang 2017/7/26.
*/
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private Context context;
private Thread.UncaughtExceptionHandler defaultHandler;
private CrashHandler(){}
//单例
private static class CrashHandlerHolder{
private static CrashHandler crashHandler = new CrashHandler();
}
public static CrashHandler getInstances(){
return CrashHandlerHolder.crashHandler;
}
public void init(Context context){
this.context = context;
defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
if(!handlerException(throwable)){
//未处理 调用系统默认的处理器处理
defaultHandler.uncaughtException(thread,throwable);//调用此方法应用崩溃时会弹出dialog
}else{
//已经人为处理
Toast.makeText(context,"已经人为处理",Toast.LENGTH_SHORT).show();
Process.killProcess(Process.myPid());
System.exit(1);
}
}
/**
*返回ture表示处理异常,返回false时表示没处理异常
*
*/
private boolean handlerException(Throwable e){
if(null == e){
return false;
}
//收集异常信息 如手机型号 系统版本
collectionException();
saveException();
return true;
}
private void collectionException() {
//code....自行编写
}
private void saveException() {
//...code...自行编写
}
}
用法:
自定义一个MyApplication继承Application,别忘了在Manifest中配置Application标签的name属性
package com.bsi.hellojni;
import android.app.Application;
/**
* Created by QianMaing on 2017/7/26.
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler.getInstances().init(getApplicationContext());
}
}