在做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中註冊
<?xml version="1.0" encoding="utf-8"?>
<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提示,進一步提升用戶體驗。