最近在研究如何控制Android的crash问题,原生状态下Android在crash的状态下回出现一个app force close的

dialog,但是对于用户体验相当不好。

想要屏蔽掉这个dialog,自己实现一个crash的handler是不难的。

1. 自己写一个类,继承UncaughtExceptionHandler。

2.在这个类里写这样的代码

mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);

这样这个类在UncaughtException发生的时候就会去调到

uncaughtException()

的方法,在这个方法里,可以自己做crash以后想要做的事情:写log,发log。

但最终还是要将程序退出的 : System.exit(0);

3.如果想要出dialog或者启动新的Activity就需要有一个Activity的Context,Application的

Context是不行的。

这样对于单个Activity的应用来说应该是很好的方法,每个Activity都去注册一个这个Crash handler,把Context传递给它。

让它去show dialog。

但是在Acitivity很多的时候就比较麻烦,要手动去维护Context的对象,一旦对象不对,UI就会阻塞了。而且在一些情况下,Activity的Crash

会导致App的重启,所以show的dialog会被后起的UI冲掉。

对于这一点,很疑惑,跟踪了下log,发现有的情况下,Activity A启动了一个新的Activity B,而B的crash有时候会导致

E/ActivityManager( 245): fail to set top app changed 这样的情况,正常情况整个App应该会被关闭,但是由于这种错误发生了

App无法被关闭,系统应该是重启了它。但是如果crash handler 里最终如果调用

mDefaultHandler.uncaughtException(thread, ex); 又会使正常退出的。找了很久没找到默认的uncaughtException的源码,所以

还是不明白到底发生了什么。

暂时,比较好的办法是将Crash handler 注册在Application上,这样它可以拿到所有的UncaughtException,但是要show UI就不行了。

没找到两全其美的办法,只能在其他的地方统一的检查是否发生过crash 然后show UI了。


更多相关文章

  1. androidの自定义控件View在Activity中使用findByViewId得到结果
  2. Android 获取蓝牙Mac地址的正确方法
  3. 分析方法论探讨
  4. android 程序开发的插件化 模块化方法 之二
  5. 关于“Android SDK manager中不出现完整Android版本安装包列表”
  6. Android关于apk版本更新方法
  7. Android之gallery 常见2种使用方法和3D效果总结

随机推荐

  1. Android的权限 permission
  2. Android(安卓)SDK Manager解决更新时的问
  3. Error:(19, 0) Gradle DSL method not fo
  4. Android-->build.gradle-->buildTypes
  5. JNI在Android中的简单使用
  6. 2011.07.08——— android n获得壁纸
  7. Android(安卓)软键盘那点事
  8. android Theme
  9. Android获取打开各种文件Intent汇总
  10. android双击返回键退出程序