Android实现将应用崩溃信息发送给开发者并重启应用的方法

2019-12-10 18:53:16刘景俊

// fetch Excpetion Info
String info = null;
ByteArrayOutputStream baos = null;
PrintStream printStream = null;
try {
  baos = new ByteArrayOutputStream();
  printStream = new PrintStream(baos);
  ex.printStackTrace(printStream);
  byte[] data = baos.toByteArray();
  info = new String(data);
  data = null;
} catch (Exception e) {
  e.printStackTrace();
} finally {
  try {
    if (printStream != null) {
      printStream.close();
    }
    if (baos != null) {
      baos.close();
    }
  } catch (Exception e) {
    e.printStackTrace();
  }
}

3.程序抛异常后,要关闭整个应用

悲催的程序员,唉,以下三种方式都无效了,咋办啊!!!

3.1 android.os.Process.killProcess(android.os.Process.myPid());

3.2 ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.restartPackage("lab.sodino.errorreport");

3.3 System.exit(0)

好吧,毛主席告诉我们:自己动手丰衣足食。

SoftApplication中声明一个变量need2Exit,其值为true标识当前的程序需要完整退出;为false时该干嘛干嘛去。该变量在应用的启动Activity.onCreate()处赋值为false。

在捕获了崩溃信息后,调用SoftApplication.setNeed2Exit(true)标识程序需要退出,并finish()掉ActErrorReport,这时ActErrorReport退栈,抛错的ActOccurError占据手机屏幕,根据Activity的生命周期其要调用onStart(),则我们在onStart()处读取need2Exit的状态,若为true,则也关闭到当前的Activity,则退出了整个应用了。此方法可以解决一次性退出已开启了多个Activity的Application。详细代码请阅读下面的示例源码。

好了,代码如下:

lab.sodino.errorreport.SoftApplication.java

package lab.sodino.errorreport;
import java.io.File;
import android.app.Application;
/**
 * @author Sodino E-mail:sodinoopen@hotmail.com
 * @version Time:2011-6-9 下午11:49:56
 */
public class SoftApplication extends Application {
  /** "/data/data/<app_package>/files/error.log" */
  public static final String PATH_ERROR_LOG = File.separator + "data" + File.separator + "data"
      + File.separator + "lab.sodino.errorreport" + File.separator + "files" + File.separator
      + "error.log";
  /** 标识是否需要退出。为true时表示当前的Activity要执行finish()。 */
  private boolean need2Exit;
  /** 异常处理类。 */
  private UEHandler ueHandler;
  public void onCreate() {
    need2Exit = false;
    ueHandler = new UEHandler(this);
    // 设置异常处理实例
    Thread.setDefaultUncaughtExceptionHandler(ueHandler);
  }
  public void setNeed2Exit(boolean bool) {
    need2Exit = bool;
  }
  public boolean need2Exit() {
    return need2Exit;
  }
}