Android自訂處理崩潰異常
用過安卓手機的使用者以及安卓開發人員們會時間長度碰到程式異常退出的情況,普通使用者遇到這種情況,肯定非常惱火,甚至會罵一生垃圾軟體,然後卸載掉。那麼開發人員們在開發過程中遇到這種情況給怎麼辦呢,當然,你不可能世界上的每個安卓手機你都要試試你的程式有沒有異常,這是無法辦到的事情,所以最好的辦法就是,當普通使用者遇到這種情況時,讓應用自動把錯誤資訊發送到你的伺服器,然後你去分析異常原因,這是不是一件很有意義的事情啊?本文參考自:http://blog.csdn.net/liuhe688/article/details/6584143,看到有些小夥伴們的一些需求,就是異常退出後,彈出一個對話方塊,讓使用者來選擇是否發送錯誤資訊,這是一個好的想法,有些童鞋可能立馬想到了AlertDialog,但是實際情況呢,根本沒反應,AlertDialog並沒有彈出來,這是為什麼呢?其實異常的時候,整個應用就已經退出了,與這個應用相關的所有的Activity都已被銷毀,AlertDialog當然不會再起作用,所以我們要換一種思路,當程式異常時,讓其跳轉到另一個Activity,並把錯誤資訊傳遞到這個Activity中,並在這裡讓使用者選擇是否發送錯誤資訊,但有些同學說,我要的是對話方塊,不是一整個介面,這好辦啊,把Activity整成對話方塊樣式不就可以了嗎?(如何設定Dialog樣式的Activity,請看:點這裡)
自訂的異常捕獲請看原文,或者下載我的源碼,實現步驟就是啟動主Activity時同時啟動一個Service,把跳轉到視窗化的Activity的方法放進Service,在捕獲到異常時,執行這個方法。
TestService.java
public class TestService extends Service {private static TestService mInstance = null;@Overridepublic IBinder onBind(Intent arg0) {return null;}@Overridepublic void onCreate() {super.onCreate();mInstance = this;}public static TestService getInstance() {return mInstance;}public void sendError(final String message){Intent intent = new Intent(this, SendErrorActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("msg", message);startActivity(intent);stopSelf();}}
異常捕獲時的處理:CrashHandler.java
/** * 自訂錯誤處理,收集錯誤資訊 發送錯誤報表等操作均在此完成. * * @param ex * @return true:如果處理了該異常資訊;否則返回false. */private boolean handleException(Throwable ex) {if (ex == null) {return false;}new Thread() {@Overridepublic void run() {Looper.prepare(); TestService.getInstance().sendError("error:made by byl");Looper.loop(); }}.start();//收集裝置參數資訊 collectDeviceInfo(mContext);//儲存記錄檔 saveCrashInfo2File(ex);return false;}
發送錯誤的Activity:
public class SendErrorActivity extends Activity implements OnClickListener{private Button ok,cancel;private String error_msg;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_loginoutinfo);getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);ok=(Button) findViewById(R.id.ok);cancel=(Button) findViewById(R.id.cancel);error_msg=getIntent().getStringExtra("msg");ok.setOnClickListener(this);cancel.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.ok:Toast.makeText(this, "發送成功("+error_msg+")", 1).show();finish();break;case R.id.cancel:finish();break;default:break;}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK ){return true;}return super.onKeyDown(keyCode, event);}}
源碼:http://download.csdn.net/detail/baiyuliang2013/7784163