Android系统的“程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可。
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import com.chinapnr.android.pf.common.util.Logger;
import android.content.Context;
public class CrashHandler implements UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler mDefaultHandler;
private static CrashHandler sInstance = new CrashHandler();
private Map<String, String> infos = new HashMap<String, String>();
private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
private Context mContext;
private IRestartCallback mRestartor = null;
public static CrashHandler getInstance() {
return sInstance;
}
public interface IRestartCallback {
public void restart();
}
public void init(Context context, IRestartCallback restartor) {
mContext = context;
mRestartor = restartor;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(thread, ex) && mDefaultHandler != null) {
mDefaultHandler.uncaughtException(thread, ex);
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Logger.e(CrashHandler.class, "error : ");
}
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
private boolean handleException(Thread thread, Throwable ex) {
if (ex == null) {
return false;
}
Logger.e(CrashHandler.class,
new StringBuffer("UncaughtException in proc[").append(ChinapnrApplication.procName).append("],thread[")
.append(thread.getName()).append(",").append(thread.getId()).append("]").toString()
+ android.util.Log.getStackTraceString(ex));
if (mRestartor != null) {
mRestartor.restart();
}
return true;
}
}
public class TestApplication extends Application {
public static int pid = 0;
public static String procName = null;
@Override
public void onCreate() {
super.onCreate();
init();
CrashHandler.getInstance().init(this, mRestartor);
}
private void init() {
pid = android.os.Process.myPid();
ActivityManager mActivityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
if (mActivityManager.getRunningAppProcesses() == null) {
Logger.e(ChinapnrApplication.class, "RuntimeEnv init exception, there is no running process.");
return;
}
for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager.getRunningAppProcesses()) {
if (appProcess != null) {
if (appProcess.pid == pid) {
procName = appProcess.processName;
}
}
}
}
private CrashHandler.IRestartCallback mRestartor = new IRestartCallback() {
@Override
public void restart() {
// 处理异常退出的流程
}
};
}
代码下载地址:
点击打开下载页面