com.example.admin.crashchuli;
importandroid.content.Context;
importandroid.content.pm.PackageInfo;
importandroid.content.pm.PackageManager;
importandroid.os.Build;
importandroid.os.Environment;
importandroid.os.Looper;
importandroid.util.Log;
importandroid.widget.Toast;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.PrintWriter;
importjava.io.StringWriter;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.TimeZone;
/** * 自定义系统的Crash捕捉类,用Toast替换系统的对话框 * 将软件版本信息,设备信息,出错信息保存在sd卡中,方便上传到服务器中 * @author ls * */publicclass CustomCrashHandler implements Thread.UncaughtExceptionHandler {privatestaticfinalString TAG =
"Activity";
privateContext mContext;
privatestaticfinalString SDCARD_ROOT = Environment.getExternalStorageDirectory().toString();
privatestaticCustomCrashHandler mInstance =
newCustomCrashHandler();
privateCustomCrashHandler(){}
/** * 单例模式,保证只有一个CustomCrashHandler实例存在 * @return */publicstaticCustomCrashHandler
getInstance(){
return}
mInstance;
/** * 异常发生时,系统回调的函数,我们在这里处理一些操作 */@OverridepublicvoiduncaughtException(Thread thread, Throwable ex) {
//将一些信息保存到SDcard中savaInfoToSD(mContext, ex);
//提示用户程序即将退出showToast(mContext,
"很抱歉,程序遭遇异常,即将退出!");
trythread.sleep(
{
2000}
);
catch}
e.printStackTrace();
(InterruptedException e) {
// android.os.Process.killProcess(android.os.Process.myPid());// System.exit(1);//完美退出程序方法}
ExitAppUtils.getInstance().exit();
/** * 为我们的应用程序设置自定义Crash处理 */publicvoidsetCustomCrashHanlerThread.setDefaultUncaughtExceptionHandler(
mContext = context;
(Context context){
this}
);
/** * 显示提示信息,需要在线程中显示Toast * @param context * @param msg */privatevoidshowToast(
finalContext context,
finalString msg){
newThread(
newRunnable() {
@Overridepublicvoidrun}
}).start();
}
Looper.loop();
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
Looper.prepare();
() {
/** * 获取一些简单的信息,软件版本,手机版本,型号等信息存放在HashMap中 * @param context * @return */privateHashMap
来源: http://blog.csdn.net/li15225271052/article/details/71037232