Android CrashHandler 自定义崩溃异常捕获

当APP 异常崩溃时,使用Toast提示,并关闭APP,收集错误信息保存并上报

需求:由于android机型的碎片化,我们在开发时无法对所以机型进行测试,因此在可能的崩溃发生时,我们应当做一些事情来为我们提供更多信息以便改进,同时也能然崩溃发生时的用户体验得到一些改善。例如程序崩溃后的重启APP、系统dialog等并不为我们想要,因此可以在APP崩溃时进行一些处理。由于现在一些第三方提供的崩溃日志的捕获上传做得也不错,对于类似我们这些中小型公司,可以集成如腾讯的Bugly、百度的测试云平台等第三方SDK进行崩溃日志的收集及上传,在我们自定义的CrashHandler里做一些交互处理即可。如使用Toast进行崩溃提示、在崩溃时关掉APP避免重启。

步骤

  • 创建CrashHandler类,继承UncaughtExceptionHandler 接口
  • 编写崩溃处理逻辑
  • 在自定义application中注册CrashHandler

代码块

public class CrashHandler implements Thread.UncaughtExceptionHandler {

    private static CrashHandler instance = new CrashHandler();
    private Context mContext;

    private CrashHandler() {}

    public static CrashHandler getInstance() {
        return instance;
    }

    public void setCustomCrashHanler(Context context) {
        mContext = context;
        //崩溃时将catch住异常
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    //崩溃时触发
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        //使用Toast进行提示
        showToast(mContext, "很抱歉,程序异常即将退出!");
        //延时退出
        try {
            thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //关闭APP
        Util.exic();
    }

    //线程中展示Toast
    private void showToast(final Context context, final String msg) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                Looper.prepare();
                Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
                Looper.loop();
            }
        }).start();
    }
}

在自定义Application的onCreate()函数中注册CrashHandle.

 @Override
    public void onCreate() {
        super.onCreate();
            CrashHandler crashHandler = CrashHandler.getInstance();
            crashHandler.setCustomCrashHanler(getApplicationContext());
            ......
        }

如果是首次自定义Application,别忘了在AndroidManifest.xml中注册。

<application
        android:name=".MyApplication"
        ......

自定义工具类,关闭所有activity以关闭APP。

public class Util {

    public static List activityList = new LinkedList();

     public static void addActivity(Activity activity) {
        activityList.add(activity);
    }

    public static void removeActivity(Activity activity) {
        if (activityList != null) {
            boolean bResult = activityList.remove(activity);
            while (bResult) {
                bResult = activityList.remove(activity);
            }
        }
    }

    public static void exic(){
         if (activityList.size() > 0) {
            for (Activity activitys : MyActivity.activityList) {
                try {
                    activitys.finish();
                } catch (Exception e) {
                }
            }
        }
        System.exit(0);
    }
}

在自定义的activity基类的onCreate()和onDestroy()中调用。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Util.addActivity(this);
        ......
    }

    @Override
    protected void onDestroy() {
        removeActivity(_this);
        ......
        super.onDestroy();
    }

最后在程序的一处写个异常如 int i=1/0; 运行到那里进行异常测试。

你可能感兴趣的:(随手记)