用过安卓手机的用户以及安卓开发者们会时长碰到程序异常退出的情况,普通用户遇到这种情况,肯定非常恼火,甚至会骂一生垃圾软件,然后卸载掉。那么开发者们在开发过程中遇到这种情况给怎么办呢,当然,你不可能世界上的每个安卓手机你都要试试你的程序有没有异常,这是无法办到的事情,所以最好的办法就是,当普通用户遇到这种情况时,让应用自动把错误信息发送到你的服务器,然后你去分析异常原因,这是不是一件很有意义的事情啊?本文参考自: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. HDU4738 tarjan割边|割边、割点模板
  2. RobotFrameWork(三)数据类型
  3. ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”
  4. 进程&线程
  5. 自定义ExpressionBuilder
  6. [设计模式] 1/2 工程与抽象工程模式 factory & Abstrac Factory
  7. codevs 1817 灾后重建
  8. #翻译# 深入JavaScript的Unicode难题(上)
  9. 用css3实现各种图标效果
  10. CreateCompatibleDC工作原理
  11. 高质量PHP代码的50个实用技巧必备(下)
  12. Ubuntu下 安装MiniGUI
  13. 2018-2019-2 网络对抗技术 20165333 Exp1 PC平台逆向破解
  14. 和不安全的Android说再见,Google为它添加新铠甲
  15. hdu 4972 根据每轮篮球赛分差求结果
  16. CCMotionStreak(一)
  17. C#多线程学习一
  18. gdb常见命令(未完,待续)
  19. LeetCode:路径总和II【113】
  20. MySql Unknown column 的解决方案

热门文章

  1. PHPCMS v9.6.0 wap模块 SQL注入
  2. Struts2--拦截器Interceptor
  3. [HNOI 2015]菜肴制作
  4. 51 nod 1439 互质对(Moblus容斥)
  5. hdu 5398 动态树LCT
  6. [bzoj4162]shlw loves matrix II
  7. Linux学习之CentOS(八)----详解文件的搜寻、查找(转)
  8. Map value类型不同的写法
  9. js获取当前的日期时间 格式“yyyy-MM-dd HH:MM:SS”
  10. 读书笔记-《Maven实战》-2018/4/16