1.自定义一个类(MaApp)继承Application

2.在清单文件中的Application选项菜单对应的name属性中添加MyApp

3.重写application中的onCreate方法

4.自定义一个类(MyCrashHandler) 实现UncaughtExceptionHandler实现其中的uncaughtException方法

5.将MyCrashHandler 采用单例设计模式 加入同步代码块

6.在MyApp类中的主线程把这个异常捕获设置进去

1 Thread.currentThread().setUncaughtExceptionHandler(MyCrashHandler.getInstance(getApplicationContext()));

7.异常的处理在MyCrashHandler中的uncaughtException中处理

上代码

MyApp类

 1 package cn.itcast.crash;
2
3 import java.lang.Thread.UncaughtExceptionHandler;
4
5 import android.app.Application;
6
7 public class MyApp extends Application {
8
9
10 /**
11 * 应用程序 的进程在第一次被创建的时候 执行的方法
12 */
13 @Override
14 public void onCreate() {
15
16 Thread.currentThread().setUncaughtExceptionHandler(MyCrashHandler.getInstance(getApplicationContext()));
17
18
19
20 super.onCreate();
21 }
22
23
24
25 }

MyCrashHandler类

 1 package cn.itcast.crash;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.PrintWriter;
6 import java.io.StringWriter;
7 import java.lang.Thread.UncaughtExceptionHandler;
8 import java.lang.reflect.Field;
9
10 import android.content.Context;
11 import android.content.pm.PackageInfo;
12 import android.os.Build;
13 import android.os.Environment;
14
15 public class MyCrashHandler implements UncaughtExceptionHandler {
16 private MyCrashHandler() {
17 };
18 private static UncaughtExceptionHandler defaultHandler;
19 //定义一个系统的默认的异常处理的handler
20 private static MyCrashHandler myCrashHandler;
21 private static Context mContext;
22
23 public synchronized static MyCrashHandler getInstance(Context context) {
24 if (myCrashHandler == null) {
25 myCrashHandler = new MyCrashHandler();
26 mContext = context;
27 defaultHandler = Thread.currentThread().getDefaultUncaughtExceptionHandler();
28 }
29 return myCrashHandler;
30 }
31
32 /**
33 * 当某一个异常 没有代码显示的捕获的时候, 系统会调用 默认的异常处理的代码 处理这个异常
34 */
35 @Override
36 public void uncaughtException(Thread thread, Throwable ex) {
37 System.out.println("出现了异常,但是被哥捕获了");
38 StringWriter wr = new StringWriter();
39 PrintWriter pw = new PrintWriter(wr);
40 ex.printStackTrace(pw);
41 StringBuilder sb = new StringBuilder();
42
43 try {
44 PackageInfo packinfo = mContext.getPackageManager().getPackageInfo(
45 mContext.getPackageName(), 0);
46 String version = packinfo.versionName;
47 sb.append("错误信息:\n");
48 sb.append("版本号:" + version + "\n");
49
50 String errorlog = wr.toString();
51 sb.append(errorlog);
52 sb.append("\n");
53
54 // 获取当前手机操作系统的信息.
55 Field[] fields = Build.class.getDeclaredFields();
56 for (Field field : fields) {
57 field.setAccessible(true);// 暴力反射,可以获取私有成员变量的信息
58 String name = field.getName();
59 String value = field.get(null).toString();
60 sb.append(name+"="+value+"\n");
61 }
62 String time ="time:"+ System.currentTimeMillis();
63 sb.append(time);
64 String log = sb.toString();
65 File file = new File(Environment.getExternalStorageDirectory(),"error.log");
66 FileOutputStream fos = new FileOutputStream(file);
67 fos.write(log.getBytes());
68 fos.flush();
69 fos.close();
70
71 android.os.Process.killProcess(android.os.Process.myPid());
72 //调用系统的默认的异常处理方法 处理这个异常
73 defaultHandler.uncaughtException(thread, ex);
74
75 } catch (Exception e) {
76 e.printStackTrace();
77 }
78
79 }
80
81 }

Android的应用程序的异常处理2的更多相关文章

  1. Android Camera 相机程序编写

    Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...

  2. Android系统的“程序异常退出”[转]

    在应用运行过程中,有很多异常可能会发生,而我们希望在异常发生的时候第一时间的保存现场. 如何处理未捕获的异常呢? 首先我们要实现一个接口  java.lang.Thread.UncaughtExcep ...

  3. pc端和android端应用程序测试有什么区别?(ps面试题)

    pc端和android端应用程序测试有什么区别?(ps面试题) [VIP7]大连-凭海临风(215687736) 2014/4/10 8:56:171.测试环境不同PC平台一般都是windows an ...

  4. 分享50款 Android 移动应用程序图标【下篇】

    在这个移动程序流行的时代,持续增长的应用程序经济充满了商业机遇.任何对应用程序设计感兴趣的人,将会喜欢上这里的50个独特的 Android 应用程序图标.这些例子中的图标能够让应用程序的设计更具吸引力 ...

  5. 分享50款 Android 移动应用程序图标【上篇】

    在这个移动程序流行的时代,持续增长的应用程序经济充满了商业机遇.任何对应用程序设计感兴趣的人,将会喜欢上这里的50个独特的 Android 应用程序图标.这些例子中的图标能够让应用程序的设计更具吸引力 ...

  6. Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端

    Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...

  7. 解决IE apk变成zip:Android 手机应用程序文件下载服务器Nginx+Tomcat配置解决方法

    APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ...

  8. 解决IE apk变成zip:Android 手机应用程序文件下载服务器 配置解决方法

    APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ...

  9. 如何开发Android Wear应用程序

    Android Wear是连接安卓手机和可穿戴产品的一个平台.自从今年上半年发布以来,Android Wear获得了大量关注,既有来自消费者的关注,也有来自开发商的关注,后者希望自己的应用程序已经准备 ...

随机推荐

  1. Linux下安装Wireshark

    Linux下安装Wireshark wireshark依赖于libpcap,所以如果系统中未安装libpcap,也要将其一并安装 一.下载源码 源码文件 wireshark-x.x.x.tar.gz  ...

  2. Unicode其实是Latin1的扩展。只有一个低字节的Uncode字符其实就是Latin1字符——附各种字符编码表及转换表

    一.概念 1,ASCII             ASCII(American Standard Code for Information Interchange),中文名称为美国信息交换标准代码.是 ...

  3. C语言的本质(6)——位运算

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型 ...

  4. CentOS Linux 语言环境设置

    程序运行使用一套语言需要有字符集(数据)和字体(显示),Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境. 一.locale详解 在 Li ...

  5. 适合入门自学服装裁剪滴书(更新ing)

    [♣]适合入门自学服装裁剪滴书(更新ing) [♣]适合入门自学服装裁剪滴书(更新ing) 适合入门自学服装裁剪滴书(更新ing) 来自: 裁缝阿普(不为良匠,便为良医.) 2014-04-06 23 ...

  6. python 生成器理解

    通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素 ...

  7. Redmine email配置

    很简单,先安装sendmail apt-get install sendmail 然后在redmine目录的配置文件conf/configuration.yml中取消几行注释: # ==== Send ...

  8. 转发:为什么Android使用弱加密算法?

      Android 2.2.1默认使用的加密算法是AES 256-SHA1,但从2010年发布的Android 2.3开始,它默认使用的是一种更弱的加密算法 RC4-MD5. 当Android应用建立 ...

  9. atitit.软件开发GUI 布局管理优缺点总结java swing wpf web html c++ qt php asp.net winform

    atitit.软件开发GUI 布局管理优缺点总结java swing wpf web html c++ qt php asp.net winform 1. Absoluti 布局(经常使用) 1 2. ...

  10. JSON数据格式介绍

    JSON定义     JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同一时候也易于机器解析和生成.它基于ECMA262语言规范(1999 ...