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. C语言malloc和free实现原理

    以下是一段简单的C代码,malloc和free到底做了什么? int main() { char* p = (char*)malloc(32); free(p); return 0; } malloc ...

  2. hdu 3934 Summer holiday(凸包最大内接三角形)

    求n个点能组成的最大三角形,一发旋转卡壳模板题... #include<algorithm> #include<iostream> #include<cstring> ...

  3. 客户端浏览器判断(ios .android)

    在开发工程中,我们可能需要判断客户端浏览器的版本而作相应的处理:通常做法是通过浏览器的userAgent去判断浏览器版本,故在此总结下,方便以后使用. <script type="te ...

  4. Java入门基础总结(二)

    判断语句 if else  如下: 1 /*    2                    语法: 3              if(条件) 4              { 5          ...

  5. 如何使用dynamic

    DataTable dt = new DataTable("TableOne"); dt.Columns.Add("ID", typeof(int));     ...

  6. Unable to open ...\tools\capture\allegro.cfg for reading

    采用Capture CIS 当生成网表.误: Unable to open ...\tools\capture\allegro.cfg for reading. Please correct the ...

  7. C# in Depth阅读笔记3:C#3特性

    1.隐式类型 var a=new Dictionary<string ,list<person>>();可以简化代码,增强可读性. 2.简化初始化 (1)设置简单属性 Pers ...

  8. Window Server 2012无线网卡和声卡驱动解决方法

    刚开始安装server2012时,驱动一直装不上以为是驱动的问题,后来在网上找了一下才明白是为啥,由于服务器默认不会开启无线LAN功能.和声卡服务,下面简单的方式给大家介绍一下解决方法: 无线网卡解决 ...

  9. Sql Server 列转行 Pivot使用

    今天正好做 数据展示,用到了列转行,行转列有多种方式,Pivot是其中的一种,Povit 是sql server 2005以后才出现的功能, 下面的业务场景: 每个月,进货渠道的总计数量[Total] ...

  10. Neo4j简介

    Neo4j简介 发表于2013年3月16日 11:52 p.m.    位于分类图数据库与图并行计算 现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS ...