Android 全局异常处理(三)
用过安卓手机的用户以及安卓开发者们会时长碰到程序异常退出的情况,普通用户遇到这种情况,肯定非常恼火,甚至会骂一生垃圾软件,然后卸载掉。那么开发者们在开发过程中遇到这种情况给怎么办呢,当然,你不可能世界上的每个安卓手机你都要试试你的程序有没有异常,这是无法办到的事情,所以最好的办法就是,当普通用户遇到这种情况时,让应用自动把错误信息发送到你的服务器,然后你去分析异常原因,这是不是一件很有意义的事情啊?本文参考自:http://blog.csdn.net/liuhe688/article/details/6584143,看到有些小伙伴们的一些需求,就是异常退出后,弹出一个对话框,让用户来选择是否发送错误信息,这是一个好的想法,有些童鞋可能立马想到了AlertDialog,但是实际情况呢,根本没反应,AlertDialog并没有弹出来,这是为什么呢?其实异常的时候,整个应用就已经退出了,与这个应用相关的所有的Activity都已被销毁,AlertDialog当然不会再起作用,所以我们要换一种思路,当程序异常时,让其跳转到另一个Activity,并把错误信息传递到这个Activity中,并在这里让用户选择是否发送错误信息,但有些同学说,我要的是对话框,不是一整个界面,这好办啊,把Activity整成对话框样式不就可以了吗?(如何设置Dialog样式的Activity,请看:点这里)
自定义的异常捕获请看原文,或者下载我的源码,实现步骤就是启动主Activity时同时启动一个Service,把跳转到窗口化的Activity的方法放进Service,在捕获到异常时,执行这个方法。
TestService.java
public class TestService extends Service { private static TestService mInstance = null; @Override
public IBinder onBind(Intent arg0) {
return null;
} @Override
public void onCreate() {
super.onCreate();
mInstance = this;
} public static TestService getInstance() {
return mInstance;
} public void sendError(final String message){
Intent intent = new Intent(this, SendErrorActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("msg", message);
startActivity(intent);
stopSelf();
} }
异常捕获时的处理:CrashHandler.java
/**
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
*
* @param ex
* @return true:如果处理了该异常信息;否则返回false.
*/
private boolean handleException(Throwable ex) {
if (ex == null) {
return false;
}
new Thread() {
@Override
public void run() {
Looper.prepare();
TestService.getInstance().sendError("error:made by byl");
Looper.loop();
}
}.start(); //收集设备参数信息
collectDeviceInfo(mContext);
//保存日志文件
saveCrashInfo2File(ex); return false;
}
发送错误的Activity:
public class SendErrorActivity extends Activity implements OnClickListener{ private Button ok,cancel;
private String error_msg; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loginoutinfo);
getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
ok=(Button) findViewById(R.id.ok);
cancel=(Button) findViewById(R.id.cancel);
error_msg=getIntent().getStringExtra("msg");
ok.setOnClickListener(this);
cancel.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ok:
Toast.makeText(this, "发送成功("+error_msg+")", 1).show();
finish();
break;
case R.id.cancel:
finish();
break;
default:
break;
} } @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK ){
return true;
}
return super.onKeyDown(keyCode, event);
} }
如图:
源码下载地址:http://download.csdn.net/detail/baiyuliang2013/7784163
Android 全局异常处理(三)的更多相关文章
- Android全局异常处理 实现自己定义做强制退出和carsh日志抓取
在做android项目开发时,大家都知道都会遇到程序报错或者Anr异常,会弹出来一个强制退出的弹出框,对于开发人员是好事,但是对于用户体验和 UI实在毫无违和感,别说用户接受不了,就连我们自己本身可能 ...
- Android 全局异常处理(二)
CrashHandler package org.wp.activity; import java.io.File; import java.io.FileOutputStream; import ...
- Android 全局异常处理(一)
from:http://onewayonelife.iteye.com/blog/1147533 from:http://blog.csdn.net/liuhe688/article/details/ ...
- 014-Spring Boot web【三】拦截器HandlerInterceptor、异常处理页面,全局异常处理ControllerAdvice
一.拦截器HandlerInterceptor 1.1.HandlerInterceptor接口说明 preHandle,congtroller执行前,如果返回false请求终端 postHandle ...
- ASP.NET Core 中间件的使用(三):全局异常处理机制
前言 我们经常听到"秒修复秒上线",觉得很厉害的样子. 其实不然,这只是一个调侃而已,出现问题的方式很多(逻辑漏洞.代码异常.操作方式不正确等). 我们今天来说代码异常问题怎么快速 ...
- mvc自定义全局异常处理
异常信息处理是任何网站必不可少的一个环节,怎么有效显示,记录,传递异常信息又成为重中之重的问题.本篇将基于上篇介绍的html2cancas截图功能,实现mvc自定义全局异常处理.先看一下最终实现效果: ...
- android Service Activity三种交互方式(付源码)(转)
android Service Activity三种交互方式(付源码) Android应用服务器OSBeanthread android Service Binder交互通信实例 最下边有源代码: ...
- Spring MVC 解决无法访问静态文件和"全局异常处理"
我们都知道,Spring MVC的请求都会去找controller控制器,若果我们页面中引入了一个外部样式,这样是没效果的, 我们引入样式的时候是通过<like href="...&q ...
- Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本文内容 为什么要全局异常处理? WebFlux REST 全 ...
随机推荐
- hibernate 中集合的保存
一.开发流程 1)引入jar包,注意引入数据库驱动包 2)创建数据库表 //创建用户表 CREATE TABLE USER( id INT PRIMARY KEY AUTO_INCREMENT, un ...
- unity, RT .DiscardContents ()导致android上RT不显示
RT .DiscardContents ()可以消除pc上的warning,但是会导致android上RT不显示.
- [Jobdu] 题目1507:不用加减乘除做加法
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入为两个整数m和n(1<=m,n<=100 ...
- 实用crontab命令
常用crontab如下: crontab -e 编辑 crontabcrontab -l 显示 crontabcrontab -r 删除 crontabcrontab -v 显示上一次编辑 cro ...
- 管道相关函数(1)-pipe
定义: int pipe(int filedes[2]); 表头文件: #include<unistd.h> 说明: pipe()会建立管道, 并将文件描述词由参数filedes数组返回. ...
- linux之basename
NAME top basename, dirname - parse pathname components SYNOPSIS top #include <libgen.h> char * ...
- Android中<uses-sdk>属性和target属性分析
1. 概要 <uses-sdk> 用来描述该应用程序可以运行的最小和最大API级别,以及应用程序开发者设计期望运行的平台版本.通过在manifest清单文件中添加该属性,我们可以更好的控制 ...
- python模块之XlsxWriter 详解
Xlsx是python用来构造xlsx文件的模块,可以向excel2007+中写text,numbers,formulas 公式以及hyperlinks超链接. 可以完成xlsx文件的自动化构造,包括 ...
- am335x 打开内部 RTC
AM335X 打开内部 RTC 过程记录. kernel version: 3.2.0 先在 make menuconfig 里面打开内部RTC的配置: make menuconfig Device ...
- springmvc+shiro认证框架配置
1,在web.xml中配置fiter,如下所示 <!-- shiro的filter --> <!-- shiro过虑器,DelegatingFilterProxy通过代理模式将spr ...