本文主要记录一个很奇怪的bug, 顺便重新认识了一下activity的生命周期
- [问题前提]:手机摄像头处理,onResume里打开摄像头, onPause里关闭摄像头
- [问题出现]:运行一段时间,会莫名其妙的自动 onPause->onResume。系统自动调用onPause,然后调用onResume, 这个本来看不出来,但是开摄像头时给了一个动画,每次打开都会调用这个动画,所以问题特别明显,打个Log发现确实是这样的问题,而且目前测试来看,几乎所有的国产手机都有这个问题,[目前的解决只是规避这个问题,还没有找到彻底的解决方案]
- [问题分析]:先不管什么权限呀这些,怀疑是之前的理解有偏差,特意看了一下google的API 查看了比较经典的Activity生命周期
—— onResume() 在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。始终后接 onPause()。
—— onPause() 当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()。 - [问题原因猜测]:不是必现,没有复现周期,猜测是系统启动某个服务或者其它的系统activity,导致我的应用短暂进入onPause,但是并没有找到具体的原因。猜测是另一个 Activity 位于屏幕前台并具有用户焦点,但我的 Activity 仍可见。也就是说,另一个 Activity 显示在我的 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。
- [问题规避]:其实去掉那个动画,是看不出来问题的,但是加个动画,打开摄像头时会看着友好一些,为了保持这个动画,所以 no zuo no die, 把动画showLoading()的启动放在 onStart 里;如果明确知道此时摄像头是关闭的,主动调用一下动画showLoading()
[附] github找到的一个比较全的Activity生命周期