现在的位置: 首页 > 综合 > 正文

关于Android的Crash

2013年08月03日 ⁄ 综合 ⁄ 共 1102字 ⁄ 字号 评论关闭

最近在研究如何控制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了。

抱歉!评论已关闭.