程序的崩溃是不可避免的,我们有时需要手动捕捉这些崩溃信息,上传服务器。Android提供了扑捉crash的方法。在Thread类中,有一个方法setDefaultUncaughtExceptionHandler;
/**
* Set the default handler invoked when a thread abruptly terminates
* due to an uncaught exception, and no other handler has been defined
* for that thread.
*
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) {
defaultUncaughtExceptionHandler = eh;
}
当Crash信息发生的时候,系统会会掉UncaughtExceptionHandler的uncaughtException方法,在这个方法中可以获取到新的异常信息。在这里我们可以处理我们的逻辑了。
下面的demo 是在手机端观看奔溃信息:
public class CrashHandle implements Thread.UncaughtExceptionHandler {
Thread.UncaughtExceptionHandler mExceptionHandler;
private Context mContext;
public CrashHandle(Context context) {
mContext = context;
mExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread t, Throwable e) {
//系统默认处理
// if (null != mExceptionHandler) {
// mExceptionHandler.uncaughtException(t, e);
// }
StringWriter mStringWriter = new StringWriter();
PrintWriter mPrintWriter = new PrintWriter(mStringWriter);
e.printStackTrace(mPrintWriter);
String crashContent = mStringWriter.toString();
//可以封装成文件创上传服务器或者先保存在sdcard.我这里是跳转到一个界面,在手机端显示错误信息。
Intent mIntent = new Intent(mContext, BugReportActivity.class);
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
mIntent.putExtra(BugReportActivity.CRASH_CONTENT, crashContent);
mContext.startActivity(mIntent);
System.exit(0);
}
}
public class BugReportActivity extends Activity {
public static final String CRASH_CONTENT = "crash";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bug_report);
TextView mCrash = (TextView) findViewById(R.id.tv_show_crash_message);
String message = getIntent().getStringExtra(CRASH_CONTENT);
mCrash.setMovementMethod(ScrollingMovementMethod.getInstance());
mCrash.append(message);
}
}
public class AlgorithmApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(new CrashHandle(this));
}
}
不要忘记在manifest添加:BugReportActivity