Android application捕获崩溃异常怎么办

 更新时间:2017年06月09日 11:49:49   作者:zheyiw  
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());
 }
}

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

相关文章

  • Android开发之计算器GridLayout布局实现方法示例

    Android开发之计算器GridLayout布局实现方法示例

    这篇文章主要介绍了Android开发之计算器GridLayout布局实现方法,结合实例形式分析了Android计算器界面布局及表达式计算相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Android开发笔记之:Dialog的使用详解

    Android开发笔记之:Dialog的使用详解

    本篇文章是对Android中Dialog的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 实例详解Android中JNI的使用方法

    实例详解Android中JNI的使用方法

    JNI是Java Native Interface的缩写,它提供若干的API实现Java与其他语言之间的通信,这篇文章主要给大家介绍了关于Android中JNI的使用方法,需要的朋友可以参考下
    2021-08-08
  • Android最简单的限制输入方法(只包含数字、字母和符号)

    Android最简单的限制输入方法(只包含数字、字母和符号)

    这篇文章主要给大家介绍了关于Android最简单的限制输入的实现方法,限制输入框只能输入数字、字母和符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看 吧
    2018-11-11
  • 关于Android中WebView远程代码执行漏洞浅析

    关于Android中WebView远程代码执行漏洞浅析

    这篇文章主要给大家介绍了关于Android中WebView远程代码执行漏洞的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • Android字体相关知识总结

    Android字体相关知识总结

    最近接到一个需求,大致内容是:全局替换当前项目中的默认字体,并引入 UI 设计师提供的一些新字体。于是对字体做了些研究,把自己的一些心得分享给大家。注意:本文所展示的系统源码都是基于Android-30 ,并提取核心部分进行分析
    2021-06-06
  • 快速了解Android Room使用细则进阶

    快速了解Android Room使用细则进阶

    这篇文章主要为大家介绍了快速了解Android Room使用细则进阶,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Android手机悬浮窗口小案例

    Android手机悬浮窗口小案例

    这篇文章主要为大家详细介绍了Android手机悬浮窗口小案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 深入探究Android动态代理的原理及用途

    深入探究Android动态代理的原理及用途

    动态代理是一种在编程中非常有用的设计模式,它允许你在运行时创建一个代理对象来代替原始对象,以便在方法调用前后执行额外的逻辑,本文将深入探讨Android动态代理的原理、用途和实际示例
    2023-09-09
  • 用Kotlin打造一个Router的示例代码

    用Kotlin打造一个Router的示例代码

    本篇文章主要介绍了用Kotlin打造一个Router的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论