博客为 有时个哥 原创,如需转载请标明出处:http://blog.youkuaiyun.com/ls703/article/details/43022243
在android中总会遇到应用崩溃现在,我们要修改就需要得带异常日志,所以我们要对崩溃时做一些友好处理,或得到日志上传服务器等操作。
这是就需要用到UncaughtExceptionHandler这个接口,这个接口是用来操作捕获应用中为捕获到的异常操作。
我们可以继承这个接口,来对全局崩溃异常做处理或信息收集。
现在写一个继承UncaughtExceptionHandler的类如下:
package ls.utils.crash;
import java.lang.Thread.UncaughtExceptionHandler;
import ls.utils.ActivityUtils;
import ls.utils.LogUtils;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
public class WholeCrashHandler implements UncaughtExceptionHandler {
private static final String TAG = "TAG";
/***************************** 单例模式 ***************************************/
private static WholeCrashHandler crashHandler = new WholeCrashHandler();
private WholeCrashHandler() {
}
public static WholeCrashHandler getInstance() {
return crashHandler;
}
/***************************************************************************/
private static final boolean ISOPEN = true; // 是否打开日志写入和发送
private Thread.UncaughtExceptionHandler mDefaultHandler;
private Context context;
public void init(Context context) {
LogUtils.i(TAG, "zhuce=====");
this.context = context;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
} else {
Activity currentActivity = ActivityUtils.Instance().getCurrentActivity();
LogUtils.i(TAG, "current===>>>>."+currentActivity);
ActivityUtils.Instance().finishAll();
Intent intent = new Intent();
intent.setClass(context, CrashHintActivity1.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
LogUtils.i(TAG, "zhuce==111===");
context.startActivity(intent);
LogUtils.i(TAG, "zhuce==2222===");
android.os.Process.killProcess(android.os.Process.myPid());
}
}
/**
* 异常处理
*
* @param ex
* 异常信息
* @return boolean true 已处理,false 未处理
*/
private boolean handleException(Throwable ex) {
if (ex == null) {
return false;
}
if (!ISOPEN) {
return false;
}
//收集设备信息
// 写入本地文件
LogUtils.write(ex);
//可以在这直接操作发送log日志
return true;
}
}
uncaughtException()这个方法会被回调,当出现崩溃时,handleException()方法是判断是否自己经行处理,如果没有就调用系统默认的对话框,
handleException()方法里是我们自己做的处理,在这里面可以把异常信息写入文件,手机设备信息,或把异常信息传到服务后台,这就看你到是要求怎么处理的了。
这里值实现了写入本地文件的操作,关于LogUtils.weite();这个方法,在上一篇博客中(Log日志工具类)已经给出了,http://blog.youkuaiyun.com/ls703/article/details/42973553
可去复制的。
然后就是uncaughtException()方法中的else部分的处理了,这部分是表示,已经对崩溃经行处理了之后的后续操作,在这里可以直接杀死应用,安全退出,也可以重起应用,也就是跳转到app的一个activity。值得注意的事,由于此时本应用处于出错状态,正常的跳转是没法完成的。得开辟新的栈来存放新开起的activity,所以在跳转activity是要加上intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);在此时看来,此处就相当于重新启动了一个app。这里的操作是走application的。如果你自己调试看一下,会看到,当前代码执行完,再重新走application,然后在启动跳转到的activity的。
下一步就是把我们这个类放到应用中,这个类放到application中,初始化一次就ok了。
public class AppContext extends Application {
@Override
public void onCreate() {
super.onCreate();
WholeCrashHandler.getInstance().init(getApplicationContext());
}
}
当然少不了在清单文件中替换自己的application了,
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name="com.application.AppContext"
>
在上面的name属性,找到自己写的继承了application的类就可以了。