用过安卓手机的用户以及安卓开发人员们会时长碰到程序异常退出的情况。普通用户遇到这样的情况,肯定非常恼火,甚至会骂一生垃圾软件,然后卸载掉。那么开发人员们在开发过程中遇到这样的情况给怎么办呢,当然,你不可能世界上的每一个安卓手机你都要试试你的程序有没有异常,这是无法办到的事情,所以最好的办法就是。当普通用户遇到这样的情况时。让应用自己主动把错误信息发送到你的server,然后你去分析异常原因。这是不是一件非常有意义的事情啊?本文參考自: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