前段時間做過一個反饋應用程序Bug的程序,今天和大家分享下
如果想要獲取應用程序的出錯信息則比較簡單,只需要通過實現 UncaughtExceptionHandler就可以達到目的,那麼如何獲取Android OS 所有應用程序的出錯信息,目前的方式只有通過修改框架層來達到此目的。
(一)首先,我們先來看如何獲取應用程序的出錯信息:
A) 繼承UncaughtExceptionHandler的類
- package org.winplus.getex;
-
- import java.lang.Thread.UncaughtExceptionHandler;
-
- import android.content.Context;
- import android.os.Looper;
- import android.util.Log;
- import android.widget.Toast;
-
- public class CrashHandler implements UncaughtExceptionHandler {
-
- private final static String TAG = "UncaughtExceptionHandler";
- private Thread.UncaughtExceptionHandler mDefaultHandler;
- private static CrashHandler mInstance;
- private Context mContext;
- private CrashHandler() {
- }
-
- /** 獲取CrashHandler實例 ,單例模式 */
- public static CrashHandler getInstance() {
- if (mInstance == null)
- mInstance = new CrashHandler();
- return mInstance;
- }
-
- @Override
- public void uncaughtException(Thread thread, Throwable throwable) {
- if (!handleException(throwable) && mDefaultHandler != null) {
- // 如果用戶沒有處理則讓系統默認的異常處理器來處理
- mDefaultHandler.uncaughtException(thread, throwable);
- } else {
- // Sleep一會後結束程序
- // 來讓線程停止一會是為了顯示Toast信息給用戶,然後Kill程序
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- Log.e(TAG, "Error : ", e);
- }
- android.os.Process.killProcess(android.os.Process.myPid());
- System.exit(10);
- }
- }
-
- private boolean handleException(Throwable ex) {
- if (ex == null) {
- return true;
- }
- final String msg = ex.getLocalizedMessage();
- // 使用Toast來顯示異常信息
- new Thread() {
- @Override
- public void run() {
- // Toast 顯示需要出現在一個線程的消息隊列中
- Looper.prepare();
- Toast.makeText(mContext, "Exception:" + msg, Toast.LENGTH_LONG).show();
- Looper.loop();
- }
- }.start();
- return true;
- }
-
- public void init(Context context) {
- mContext = context;
- mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
- Thread.setDefaultUncaughtExceptionHandler(this);
- }
-
-
- }
B) 初始化並啟動獲取異常的線程類:CrashApplication
- import android.app.Application;
-
- public class CrashApplication extends Application {
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- CrashHandler crashHandler = CrashHandler.getInstance();
- // 注冊crashHandler
- crashHandler.init(getApplicationContext());
- }
- }
C) 記得修改AndroidManifest.xml文件~~~
D) 寫一個用於測試的Activity
- public class GetExceptionActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- int i = 1/0;//除數不能為0 這裡會拋出異常
- }
- }