public class UEHandler implements Thread.UncaughtExceptionHandler { private MyApp softApp; private Context context; public UEHandler(MyApp app,Context context) { softApp = app; this.context = context; } public void uncaughtException(Thread thread, Throwable ex) { // fetch Excpetion Info ex.printStackTrace(); // print long threadId = thread.getId(); //Log.d("ANDROID_LAB", "Thread.getName()=" + thread.getName() + " id=" + threadId + " state=" + thread.getState()); //Log.d("ANDROID_LAB", "Error[" + info + "]"); new Thread() { @Override public void run() { Looper.prepare(); Toast.makeText(context, "很抱歉,程序出现异常,即将退出。", Toast.LENGTH_LONG).show(); Looper.loop(); } }.start(); try { thread.sleep(3*1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (threadId != 1) { // 此处示例跳转到汇报异常界面。 Intent intent = new Intent(softApp, splash.class); softApp.startActivity(intent); } else { // 此处示例发生异常后,重新启动应用 Intent intent = new Intent(softApp, splash.class); // 如果<span style="background-color: rgb(255, 255, 255); ">没有NEW_TASK标识且</span>是UI线程抛的异常则界面卡死直到ANR intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); softApp.startActivity(intent); // write 2 /data/data/<app_package>/files/error.log // kill App Progress android.os.Process.killProcess(android.os.Process.myPid()); } } }
public void onCreate() { super.onCreate(); need2Exit = false; ueHandler = new UEHandler(this,getApplicationContext()); Thread.setDefaultUncaughtExceptionHandler(ueHandler); // 程序崩溃时触发线程 }