`

Android 捕获App意外退出错误的日志信息

阅读更多
  1.创建获取日志信息的类AppLogHandler,该类的功能是捕获导致应用程序意外退出的错误的日志信息,这里写的是一个错误保存一个log文件,保存到SD卡对应的目录下。代码如下:
package com.ryan.test.crash;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.Thread.UncaughtExceptionHandler;

import android.content.Context;
import android.os.Environment;
import android.os.Looper;

public class AppLogHandler implements UncaughtExceptionHandler {

	public static final boolean DEBUG = true;

	public static final String AGR_LOG_DIRECOTORY = "agrlog";

	private Thread.UncaughtExceptionHandler mDefaultHandler;

	private static AppLogHandler instance;

	private AppLogHandler() {
	}

	public static AppLogHandler getInstance() {
		if (instance == null) {
			instance = new AppLogHandler();
		}
		return instance;
	}

	public void init(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 {
			try {
				Thread.sleep(3000);
			} catch (Exception e) {
				e.printStackTrace();
			}
			android.os.Process.killProcess(android.os.Process.myPid());
			System.exit(10);
		}
	}

	private boolean handleException(final Throwable ex) {
		if (DEBUG) {
			if (ex == null) {
				return false;
			}
			final StackTraceElement[] stack = ex.getStackTrace();
			final String message = ex.getMessage();
			new Thread() {
				@Override
				public void run() {
					Looper.prepare();
					createLogDirectory();
					String fileName = AGR_LOG_DIRECOTORY + "/crash-" + System.currentTimeMillis() + ".log";
					File file = new File(
							Environment.getExternalStorageDirectory(), fileName);
					try {
						FileOutputStream fos = new FileOutputStream(file, true);
						fos.write(message.getBytes());
						for (int i = 0; i < stack.length; i++) {
							fos.write(stack[i].toString().getBytes());
						}
						fos.flush();
						fos.close();
					} catch (Exception e) {
					}
					Looper.loop();
				}
			}.start();
		}
		return false;
	}

	private void createLogDirectory() {
		File file = new File(Environment.getExternalStorageDirectory(), AGR_LOG_DIRECOTORY);
		try {
			if (!file.exists() || !file.isDirectory()) {
				file.mkdir();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


  2.为了读取Logcat的信息并保存到SD卡中,必须添加对应的权限:
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  3.新建MyApplication类继承自Application,在应用启动时开启对导致程序意外退出的错误的捕获:
import com.ryan.test.crash.AppLogHandler;

import android.app.Application;

public class MyApplication extends Application{

	@Override
	public void onCreate() {
		super.onCreate();
		AppLogHandler appLogHandler = AppLogHandler.getInstance();
		appLogHandler.init(getApplicationContext());
	}
}


  4.为了使MyApplication生效,必须修改AndroidMenifest.xml文件:
 <application
        android:name="com.ryan.test.MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar">
       <!-- 省略其他信息 -->
 </application>
分享到:
评论
1 楼 mnameyang 2013-05-12  
[u][/u]

相关推荐

    Android捕获全局异常并写日志保存到sd卡.rar

    Android捕获全局异常并写日志保存到sd卡,捕获异常消息后输出这个消息,可避免APP强制退出,抛出NullPointException玩玩哈,捕获全局异常是因为有的异常我们捕获不到,捕获时我们采用同步方法,以免单例多线程环境下...

    ANDROID 完美退出APP的实例代码

    介绍了ANDROID 完美退出APP的实例代码,有需要的朋友可以参考一下

    Android编程实现捕获程序异常退出时的错误log信息功能详解

    主要介绍了Android编程实现捕获程序异常退出时的错误log信息功能,结合实例形式分析了Android异常信息捕获与日志操作相关实现技巧,需要的朋友可以参考下

    android自动化演示实例

    下载后,先看readme.txt: 1.Android 自动化测试1:启动app的默认...4.Android 自动化测试4:最后,绘制笑脸,关闭应用,退出app,断开连接 简单粗暴的演示自动化在native app上面的执行效果,并在最后绘制了一个笑脸。

    Android application捕获崩溃异常怎么办

    2、捕获崩溃异常,保存错误日志,并重启应用 public class HKBaseApplication extends Application { // activity对象列表,用于activity统一管理 private List&lt;Activity&gt; activityList; // 异常捕获 protected ...

    Android Crash 治理之道

    Crash是指由于未处理的异常或者信号导致的意外退出,使得Android应用崩溃。当应用崩溃时,Android会杀死应用的进程并显示一个对话框来告知用户,他的应用由于未知的意外而停止了。当然现在的国内厂商自定义的系统...

    Android Back键点击两次退出应用详解及实现方法总结

    思路:Android中捕获用户按键是在onKeyDown方法中,只需要判断用户按键是否是KEYCODE_BACK即后退键即可,剩下的即为判断两次点击BACK键时间间隔问题了 第一种实现方式 package com.example.clickexittest; ...

    捕获异常自动重启

    若app因为不明原因崩溃退出,1秒后会重启程序。若app因为不明原因崩溃退出,1秒后会重启程序。

    Android实现点击两次BACK键退出应用

    思路:Android中捕获用户按键是在onKeyDown方法中,只需要判断用户按键是否是KEYCODE_BACK即后退键即可,剩下的即为判断两次点击BACK键时间间隔问题了。 第一种实现方式: package com.example.clickexittest; ...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--android 模拟器错误 |--android 横竖屏切换 |--android 获取mac地址 |--android 获取sd卡状态 |--android 设置apn |--android 调节屏幕亮度 |--android 资源uri |--android 还原短信 |--android 重启 |--android...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目源代码

    文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java...

Global site tag (gtag.js) - Google Analytics