当前位置: 首页 > 编程笔记 >

Android application捕获崩溃异常怎么办

唐俊爽
2023-03-14
本文向大家介绍Android application捕获崩溃异常怎么办,包括了Android application捕获崩溃异常怎么办的使用技巧和注意事项,需要的朋友参考一下

Android application捕获崩溃异常怎么办?

通用 application
1、收集所有 avtivity 用于彻底退出应用
2、捕获崩溃异常,保存错误日志,并重启应用

public class HKBaseApplication extends Application {
 // activity对象列表,用于activity统一管理
 private List<Activity> activityList;
 // 异常捕获
 protected boolean isNeedCaughtExeption = true;// 是否捕获未知异常
 private PendingIntent restartIntent;
 private MyUncaughtExceptionHandler uncaughtExceptionHandler;
 private String packgeName;

 @Override
 public void onCreate() {
 super.onCreate();

 activityList = new ArrayList<Activity>();
 packgeName = getPackageName();

 if (isNeedCaughtExeption) {
  cauchException();
 }
 }

 // -------------------异常捕获-----捕获异常后重启系统-----------------//

 private void cauchException() {
 Intent intent = new Intent();
 // 参数1:包名,参数2:程序入口的activity
 intent.setClassName(packgeName, packgeName + ".LoginActivity");
 restartIntent = PendingIntent.getActivity(getApplicationContext(), -1, intent,
  Intent.FLAG_ACTIVITY_NEW_TASK);

 // 程序崩溃时触发线程
 uncaughtExceptionHandler = new MyUncaughtExceptionHandler();
 Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler);
 }

 // 创建服务用于捕获崩溃异常
 private class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
 @Override
 public void uncaughtException(Thread thread, Throwable ex) {
  // 保存错误日志
  saveCatchInfo2File(ex);

  // 1秒钟后重启应用
  AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
  mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent);

  // 关闭当前应用
  finishAllActivity();
  finishProgram();
 }
 };

 /**
 * 保存错误信息到文件中
 * 
 * @return 返回文件名称
 */
 private String saveCatchInfo2File(Throwable ex) {
 Writer writer = new StringWriter();
 PrintWriter printWriter = new PrintWriter(writer);
 ex.printStackTrace(printWriter);
 Throwable cause = ex.getCause();
 while (cause != null) {
  cause.printStackTrace(printWriter);
  cause = cause.getCause();
 }
 printWriter.close();
 String sb = writer.toString();
 try {
  DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
  String time = formatter.format(new Date());
  String fileName = time + ".txt";
  System.out.println("fileName:" + fileName);
  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
  String filePath = Environment.getExternalStorageDirectory() + "/HKDownload/" + packgeName
   + "/crash/";
  File dir = new File(filePath);
  if (!dir.exists()) {
   if (!dir.mkdirs()) {
   // 创建目录失败: 一般是因为SD卡被拔出了
   return "";
   }
  }
  System.out.println("filePath + fileName:" + filePath + fileName);
  FileOutputStream fos = new FileOutputStream(filePath + fileName);
  fos.write(sb.getBytes());
  fos.close();
  //文件保存完了之后,在应用下次启动的时候去检查错误日志,发现新的错误日志,就发送给开发者
  }
  return fileName;
 } catch (Exception e) {
  System.out.println("an error occured while writing file..." + e.getMessage());
 }
 return null;
 }

 // ------------------------------activity管理-----------------------//

 // activity管理:从列表中移除activity
 public void removeActivity(Activity activity) {
 activityList.remove(activity);
 }

 // activity管理:添加activity到列表
 public void addActivity(Activity activity) {
 activityList.add(activity);
 }

 // activity管理:结束所有activity
 public void finishAllActivity() {
 for (Activity activity : activityList) {
  if (null != activity) {
  activity.finish();
  }
 }
 }

 // 结束线程,一般与finishAllActivity()一起使用
 // 例如: finishAllActivity;finishProgram();
 public void finishProgram() {
 android.os.Process.killProcess(android.os.Process.myPid());
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 我正在寻找一种方法,在不让应用程序崩溃的情况下,将异常导入到解析崩溃报告管道中。 使用Parse 1.9.1,我没有看到任何API调用允许将用户生成的异常发送到崩溃报告,而不让异常崩溃应用程序。Parse已经有了一个很好的UI来显示异常,那么我为什么要推出一个解决方案来从捕获的异常中获取堆栈跟踪呢? 我尝试从一个throwable中实例化一个ParseException,但这不会隐式地导致发送崩溃

  • 代码: 崩溃仍然被抛出。见下文: 2019-02-20 19:45:22.514 22435-22435/com.xxx。xxx E/PedalApp:无法保存层java.lang.RuntimeException:停止失败。在android.media.MediaRecorder。在com.androidchekhov.looperpedal.PedalActivity$onCreate$6.i

  • 本文向大家介绍iOS 捕获程序崩溃日志,包括了iOS 捕获程序崩溃日志的使用技巧和注意事项,需要的朋友参考一下 iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者? 下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作 官方文档介绍:Sets the top-level error-handling function

  • 使用Java(android,但这是一个Java问题),我在应用程序类中创建了一个默认的异常处理程序,大致如下所示,它取自一些SO线程: 让我们谈谈我的目标是什么。我需要为crashLytics事故报告记录额外的信息。因此,每当发生异常时,就会调用钩子uncaughtException(线程线程,可抛出的ex)。我假设这将适用于崩溃和异常(不确定)。 关于这个问题的3个问题: 更新:我在这里看到有

  • 问题内容: 我正在为Android开发Java应用程序,目前遇到了一个问题,调试器正在进入catch块,并且ex为何为null?有人看过这样的东西吗? 问题答案: 这听起来像源代码,并且编译的类不同步,因此调试器正在进入错误的块。 尝试进行清理,然后进行重建。