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