1原理:
java的Thread中有一个UncaughtExceptionHandler接口,该接口的作用主要是为了 当 Thread 因未捕获的异常而突然终止时,调用处理程序。
接口下面有setDefaultUncaughtExceptionHandler(
Thread.UncaughtExceptionHandler eh)
方法,方法主要作用为设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。
2怎么做
一般是在定义一个Application设置异常处理,因为APPlication会在所有的Activity启动之前就已经启动就在那里面设置异常的的处理。
2.1
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
2.2
package com.cpp.learn.crashdeal;
import android.app.Application;
import android.content.Context;
import android.os.*;
import android.os.Process;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
/**
*Created by Administrator on 2015/5/16.
*/
public class MyApplication extendsApplication{
@Override
public void onCreate() {
super.onCreate();
getExceptionFromSD();
mDefaultHandler =Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public voiduncaughtException(Thread thread, Throwable ex) {
wirteCrashToSD(ex);
}
});
}
private void getExceptionFromSD() {
try {
FileInputStream inputStream =getBaseContext().openFileInput("crashLog.txt");
int size = inputStream.available();
byte [] b = new byte[size];
inputStream.read(b);
String strException = new String(b);
Log.i("crashDeal","Exception"+strException);
File file = getFileStreamPath("crashLog.txt");
file.delete();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void wirteCrashToSD(Throwable ex) {
try {
FileOutputStream out =getBaseContext().openFileOutput("crashLog.txt",Context.MODE_PRIVATE);
PrintStream printStream = newPrintStream(out);
ex.printStackTrace(printStream);
printStream.println();
printStream.println("Phone");
printStream.println(Build.MANUFACTURER);
printStream.println("Model");
printStream.println(Build.MODEL);
printStream.close();
android.os.Process.killProcess(Process.myPid());
Log.i("crashDeal","dealover");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}