after lock screen the system does not invoke the method on destory

今天遇到用户反映应用总是闪退。

现象: 在MainActivity后,只要进入任何主进程相关的二级界面,都会导致应用闪退(注:不是崩溃引起的,只是闪退)

分析: 1.看log日志,退出前有抛出异常,但查看该处代码发现异常已经被catch住,异常信息被打印出来而已。

2.怀疑是每个Activity实现时,其父类BaseActivity有干坏事,则重新自定义了一个Activity不继承自父类,发现现象仍存在,该Activity仍闪退。(vinney,thanks)

3.发现每次MainActivity的自定义的exitApp()都被调用了,设置断点,发现是由onDestory()发起的,而onDestory()则是由系统调用的。

4.怀疑每个Activity的onDestory()在从屏幕消失后都会被立即调用,写了个小demo,得到验证。开始怀疑是机子问题。

5.google关键字"三星 Activity 闪退"真相出来了,发一有笑点的帖子http://zhidao.baidu.com/question/493015963.html。至此定位原因。

原因: 此三星设备中,有一个"开发者选项→不保留活动(用户离开后立即清除每个活动)",即会导致进入从MainActivity离开后都会调用MainActivity.onDestory(),导致执行退出操作,闪退(edit by sodino)

恢复: 取消掉"不保留活动"的选项即可

有没有即使勾选了"不保留活动"但app内能解决的方法?可以,在MainActivity处的onDestory()不调用退出应用操作。可能重写finish(),当代码明确调用finish()后再执行退出应用操作。但仍会有个缺点即为Activity.onDestory()后,从二级界面按返回键回到MainActivity时,会有一段短暂的黑屏,然后才恢复的情况。

安卓4.0之后的版本,在设置-辅助功能-开发人员工具中,多出很多选项,其中有一项是"不保留活动”(用户离开后即销毁整个活动)的选项,默认是不开启的。

该功能最初我一直以为是退出应用后或者关闭屏幕后关闭所有后台,应该不止我一个这么认为吧,其实不然。

举个例子,大家打开一个应用程序,比如ucweb,进入了一个网页百度,然后点了新闻,进入了百度新闻页面。一般情况下,uc默认这个时候之前的网页即百度首页还是保存在内存中的,只要按一下返回按钮,马上就可以回到原来的页面,加载非常迅速。但是当开启了"不保留活动"功能之后,相当于当你进入百度新闻页面之后,之前的百度首页的页面就直接kill了,这个时候如果返回的话,又要重新加载百度首页了。

上面这个例子不完全准确,只是比较容易理解。想要说明的是,不保留活动其实是离开前一个页面之后,前一个页面就会直接被k掉,如果返回则需要重新加载。

再举个例子,新浪微博,当你在看微博,然后点击了其中一条微博查看详细内容,看完返回,一般情况下这个时候直接回到原来你查看的地方,但是当开启"不保留活动"之后,你返回,系统会重新加载微博首页的页面,这样不仅需要重新加载的时间,而且又会从头开始。

而且目前大部分软件不支持该功能,所以会造成非常多的bug,我在使用过程中发现很多软件因此无法使用,比如zaker,进入首页的图片之后,无法进入下一界面,一直提示出错。还有不少网友反馈勾选了该选项之后,一些游戏以及QQ会出现闪退现象,不能够设置和读取数据。

所以,建议大家不要开启该功能。

http://blog.csdn.net/sodino/article/details/9774779

http://www.nnsjdd.com/thread-1066-1-1.html