android应用开发-------------应用崩溃全局异常捕获处理(UncaughtExceptionHandler)

博客为 有时个哥 原创,如需转载请标明出处:http://blog.csdn.net/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.csdn.net/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的类就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值