Android全域性異常處理
在做android專案開發時,大家都知道如果程式出錯了,會彈出來一個強制退出的彈出框,這個本身沒什麼問題,但是這個UI實在是太醜了,別說使用者接受不了,就連我們自己本身可能都接受不了。雖然我們在釋出程式時總會經過仔細的測試,但是難免會碰到預料不到的錯誤。
今天就來自定義一個程式出錯時的處理,類似iphone的閃退。(雖然閃退也是使用者不願意看到的,但是在使用者體驗上明顯比那個原生的彈窗好多了)
廢話不多說,直接上程式碼:
CrashHandler
* 自定義的 異常處理類 , 實現了 UncaughtExceptionHandler介面 * */ public class CrashHandler implements UncaughtExceptionHandler { // 需求是 整個應用程式 只有一個 MyCrash-Handler private static CrashHandler INSTANCE ; private Context context; //1.私有化構造方法 private CrashHandler(){ } public static synchronized CrashHandler getInstance(){ if (INSTANCE == null) INSTANCE = new CrashHandler(); return INSTANCE; } public void init(Context context){ this.context = context; } public void uncaughtException(Thread arg0, Throwable arg1) { System.out.println("程式掛掉了 "); // 在此可以把使用者手機的一些資訊以及異常資訊捕獲並上傳,由於UMeng在這方面有很程式的api介面來呼叫,故沒有考慮 //幹掉當前的程式 android.os.Process.killProcess(android.os.Process.myPid()); } }
CrashApplication
* 在開發應用時都會和Activity打交道,而Application使用的就相對較少了。 * Application是用來管理應用程式的全域性狀態的,比如載入資原始檔。 * 在應用程式啟動的時候Application會首先建立,然後才會根據情況(Intent)啟動相應的Activity或者Service。 * 在本文將在Application中註冊未捕獲異常處理器。 */ public class CrashApplication extends Application { @Override public void onCreate() { super.onCreate(); CrashHandler handler = CrashHandler.getInstance(); handler.init(getApplicationContext()); Thread.setDefaultUncaughtExceptionHandler(handler); } }
在AndroidManifest.xml中註冊
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.wp.activity" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".CrashApplication" android:debuggable="true"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="8" /> </manifest>
至此,可以測試下在出錯的時候程式會直接閃退,並殺死後臺程序。當然也可以自定義一些比較友好的出錯UI提示,進一步提升使用者體驗。