1、程序中故意抛出异常:

public class ExceptionActivity extends Activity {

    String str;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
str.equals("exception"); }
}

2、实现UncaughtExceptionHandler接口:

public class MyCrashHandler implements UncaughtExceptionHandler {
// 保证MyCrashHandler只有一个实例
// 2.提供一个静态的程序变量
private static MyCrashHandler myCrashHandler;
private Context context; // 1.私有化构造方法
private MyCrashHandler() { } // 3.暴露出来一个静态的方法 获取myCrashHandler public static synchronized MyCrashHandler getInstance() {
if (myCrashHandler == null) {
myCrashHandler = new MyCrashHandler();
}
return myCrashHandler;
} public void init(Context context) {
this.context = context;
} // 程序发生异常的时候调用的方法
// try catch @Override
public void uncaughtException(Thread thread, Throwable ex) {
System.out.println("出现错误啦 哈哈");
StringBuilder sb = new StringBuilder();
// 1.获取当前应用程序的版本号.
PackageManager pm = context.getPackageManager();
try {
PackageInfo packinfo = pm.getPackageInfo(context.getPackageName(),
0);
sb.append("程序的版本号为" + packinfo.versionName);
sb.append("\n"); // 2.获取手机的硬件信息.
Field[] fields = Build.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
// 暴力反射,获取私有的字段信息
fields[i].setAccessible(true);
String name = fields[i].getName();
sb.append(name + " = ");
String value = fields[i].get(null).toString();
sb.append(value);
sb.append("\n");
}
// 3.获取程序错误的堆栈信息 .
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
ex.printStackTrace(printWriter); String result = writer.toString();
sb.append(result); System.out.println(sb.toString()); // 4.把错误信息 提交到服务器 } catch (Exception e) {
e.printStackTrace();
} // 完成自杀的操作
android.os.Process.killProcess(android.os.Process.myPid());
} }

3、注册UncaughtExceptionHandler接口的实现类:

public class MyApp extends Application {

    //在整个应用第一次被创建出来的时候 执行
// 在应用程序对应的进程 第一次创建出来的时候执行
@Override
public void onCreate() {
super.onCreate();
//把自定义的异常处理类设置 给主线程
MyCrashHandler myCrashHandler = MyCrashHandler.getInstance();
myCrashHandler.init(getApplicationContext());
Thread.currentThread().setUncaughtExceptionHandler(myCrashHandler);
}
}

4、修改配置文件:

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" android:name="MyApp">
<activity
android:label="@string/app_name"
android:name=".ExceptionActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

最新文章

  1. CSS系列:CSS常用样式
  2. 一起学习jQuery2.0.3源码—1.开篇
  3. IntelliIDEA注册码
  4. spring源码学习之路---AOP初探(六)
  5. java poi导入EXCEL xls文件代码
  6. 深度学习论文笔记-Deep Learning Face Representation from Predicting 10,000 Classes
  7. UIKit: UIResponder(转自南峰子博客)
  8. 在往oracle中插数据时,如何处理excel读取的时间空值
  9. [Head First Python]6. 定制数据对象:打包代码与数据
  10. Chapter 4 Invitations——2
  11. Linux命令(九)查找文件find
  12. jsp登陆界面代码
  13. Nginx:论高并发,在座各位都是渣渣
  14. 【转】Andorid中Intent的使用-返回数据给上一个活动
  15. 20145333 《网络对抗技术》 PC平台逆向破解
  16. L205 EE
  17. .net core RabbitMQ 消息队列
  18. DataGuard快照(snapshot)数据库
  19. 信息安全意识教育日历——By 安全牛
  20. 018-面向接口编程的BeanFactory模板代码

热门文章

  1. HDU 1754——I Hate It——————【线段树单点替换、区间求最大值】
  2. HDU 1166——敌兵布阵——————【线段树单点增减、区间求和】
  3. 面试题 数据库sql
  4. [转]微信小程序(应用号)是什么,是否值得投入进来做?
  5. c#学习基础(2)存储、值类型和引用类型、变量
  6. (四) HTML之表单元素
  7. 键盘按键keyCode大全,js页面快捷键
  8. 用AJAX实现页面登陆以及注册用户名验证
  9. ASTreeView Demo:Add, Edit &amp; Delete nodes
  10. 清除canvas画布内容--点擦除+线擦除