提供一个出现未捕获异常时,显式捕获的类(单例)
使用之前要在 Application类中初始化一下
//
设置出现未捕获异常时的处理类
CrashHandler.getInstance().init();
/**
* Created by Administrator on 2016/11/13.
* 提供一个出现未捕获异常时,显式捕获的类(单例)
*/
public class CrashHandler implements Thread.UncaughtExceptionHandler {
// 系统默认的未捕获异常的处理器
public Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler;
//懒汉式
private CrashHandler() {
}
private static CrashHandler instance = null;
public static CrashHandler getInstance() {
if (instance == null) {
instance = new CrashHandler();
}
return instance;
}
public void init() {
defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
// 将当前的类,作为出现未捕获异常时的处理类
Thread.setDefaultUncaughtExceptionHandler(this);
}
//当程序执行过程中,一旦出现未被捕获的异常时,即调用如下的回调方法
@Override
public void uncaughtException(Thread thread, final Throwable ex) {
// 处理异常的操作,系统单独提供了一个分线程来执行
//这是另外一个线程,应该把他放到主线程中执行
new Thread() {
public void run() {
//默认情况下,线程是不可以开启Looper进行消息的处理的,除非是主线程,调一下此方法,系统自动让其在主线程中执行
Looper.prepare();
Toast.makeText(UIUtils.getContext(), "正在努力修复中...", Toast.LENGTH_SHORT).show();
Log.e("Tag", "出现异常了" + ex.getMessage());
Looper.loop();
}
}.start();
// 收集用户出现的异常信息,并发送给后台
collectionException(ex);
SystemClock.sleep(2000);
// 移除栈空间中所有的activity
ActivityManager.getInstance().removeAll();
// 结束当前进程
android.os.Process.killProcess(android.os.Process.myPid());
// 结束当前虚拟机的执行
System.exit(0);
}
private void collectionException(Throwable ex) {
final String exception = ex.getMessage();
// 收集手机的设备信息 ,信息都封装在build类中
final String message = Build.DEVICE + ":" + Build.MODEL + ":" + Build.PRODUCT + ":" + Build.VERSION.SDK_INT;
// 模拟打印出来,实际上是联网发送给后台
new Thread() {
public void run() {
Log.e("TAG", "exception=" + exception + ",message=" + message);
}
}.start();
}
}