Android CrashHandler 自定义崩溃异常捕获
2016-07-04 21:35
696 查看
当APP 异常崩溃时,使用Toast提示,并关闭APP,收集错误信息保存并上报
需求:由于android机型的碎片化,我们在开发时无法对所以机型进行测试,因此在可能的崩溃发生时,我们应当做一些事情来为我们提供更多信息以便改进,同时也能然崩溃发生时的用户体验得到一些改善。例如程序崩溃后的重启APP、系统dialog等并不为我们想要,因此可以在APP崩溃时进行一些处理。由于现在一些第三方提供的崩溃日志的捕获上传做得也不错,对于类似我们这些中小型公司,可以集成如腾讯的Bugly、百度的测试云平台等第三方SDK进行崩溃日志的收集及上传,在我们自定义的CrashHandler里做一些交互处理即可。如使用Toast进行崩溃提示、在崩溃时关掉APP避免重启。步骤
创建CrashHandler类,继承UncaughtExceptionHandler 接口编写崩溃处理逻辑
在自定义application中注册CrashHandler
代码块
public class CrashHandler implements Thread.UncaughtExceptionHandler { private static CrashHandler instance = new CrashHandler(); private Context mContext; private CrashHandler() {} public static CrashHandler getInstance() { return instance; } public void setCustomCrashHanler(Context context) { mContext = context; //崩溃时将catch住异常 Thread.setDefaultUncaughtExceptionHandler(this); } //崩溃时触发 @Override public void uncaughtException(Thread thread, Throwable ex) { //使用Toast进行提示 showToast(mContext, "很抱歉,程序异常即将退出!"); //延时退出 try { thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //关闭APP Util.exic(); } //线程中展示Toast private void showToast(final Context context, final String msg) { new Thread(new Runnable() { @Override public void run() { Looper.prepare(); Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); Looper.loop(); } }).start(); } }
在自定义Application的onCreate()函数中注册CrashHandle.
@Override public void onCreate() { super.onCreate(); CrashHandler crashHandler = CrashHandler.getInstance(); crashHandler.setCustomCrashHanler(getApplicationContext()); ...... }
如果是首次自定义Application,别忘了在AndroidManifest.xml中注册。
<application android:name=".MyApplication" ......
自定义工具类,关闭所有activity以关闭APP。
public class Util { public static List<Activity> activityList = new LinkedList<Activity>(); public static void addActivity(Activity activity) { activityList.add(activity); } public static void removeActivity(Activity activity) { if (activityList != null) { boolean bResult = activityList.remove(activity); while (bResult) { bResult = activityList.remove(activity); } } } public static void exic(){ if (activityList.size() > 0) { for (Activity activitys : MyActivity.activityList) { try { activitys.finish(); } catch (Exception e) { } } } System.exit(0); } }
在自定义的activity基类的onCreate()和onDestroy()中调用。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Util.addActivity(this); ...... } @Override protected void onDestroy() { removeActivity(_this); ...... super.onDestroy(); }
最后在程序的一处写个异常如
int i=1/0;运行到那里进行异常测试。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories