在Android中自定义捕获Application全局异常

时间:2021-10-22 17:23:48
现在安装 Android 系统的手机和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开发者应该及时获取在该设备上导致崩溃的信息,这对于下一个版本的 BUG 修复帮助极大,所以今天就来介绍一下如何在程序崩溃的情况下收集相关的设备参数信息和具体的异常信息,并发送这些信息到服务器供开发者分析和调试程序。
 
1 定义自身Application,在onCreate方法中初始化自定义异常处理类。
if (!SysConfig.DEVELOP_MODE) {  
            LogCrashHandler.getInstance().init(this);  
}  
2 实现异常处理类。
public class LogCrashHandler implements UncaughtExceptionHandler {  
    private static final String TAG = "CrashHandler";  
    private UncaughtExceptionHandler mDefaultHandler;// 系统默认的UncaughtException处理类  
    private static LogCrashHandler INSTANCE = new LogCrashHandler();// CrashHandler实例  
    private Context mContext;// 程序的Context对象  
  
    /** 
     * 保证只有一个CrashHandler实例 
     */  
    private LogCrashHandler() {  
    }  
  
    /** 
     * 获取CrashHandler实例 ,单例模式 
     */  
    public static LogCrashHandler getInstance() {  
        return INSTANCE;  
    }  
  
    /** 
     * 初始化 
     * 
     * @param context 
     */  
    public void init(Context context) {  
        mContext = context;  
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 获取系统默认的UncaughtException处理器  
        Thread.setDefaultUncaughtExceptionHandler(this);// 设置该CrashHandler为程序的默认处理器  
    }  
  
    /** 
     * 当UncaughtException发生时会转入该重写的方法来处理 
     */  
    public void uncaughtException(Thread thread, Throwable ex) {  
        if (!handleException(ex) && mDefaultHandler != null) {  
            // 如果自定义的没有处理则让系统默认的异常处理器来处理  
            mDefaultHandler.uncaughtException(thread, ex);  
        } else {  
            // 退出程序  
            try {  
                Thread.sleep(1000);// 如果处理了,让程序继续运行3秒再退出,保证文件保存并上传到服务器  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            UUApp.getInstance().exitCrash();  
            android.os.Process.killProcess(android.os.Process.myPid());  
            System.exit(1);  
        }  
    }  
  
    /** 
     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 
     * 
     * @param ex 异常信息 
     * @return true 如果处理了该异常信息;否则返回false. 
     */  
    public boolean handleException(Throwable ex) {  
        if (ex == null)  
            return true;  
        L.e("error:" + ex.getMessage());  
        new Thread() {  
            public void run() {  
                Looper.prepare();  
                Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出", Toast.LENGTH_SHORT).show();  
  
                Looper.loop();  
            }  
        }.start();  
        return true;  
    }  
}  
这样当APP出现异常情况时不会生硬的弹出android的原生崩溃界面而是弹出我们自定义的异常处理界面