Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自定義處理崩潰異常

Android自定義處理崩潰異常

編輯:關於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;
	
	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	@Override
	public 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() {
			@Override
			public 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;
	
	@Override
	protected 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);
	}

	@Override
	public 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;
		}
		
	}
	
	@Override
	public 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






  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved