在一次项目中尝试使用DialogActivity(对话框式活动)时又恰巧调用了摄像头,有oneActivity(普通活动)和twoActivity(对话框式活动),两个活动均使用了摄像头,oneActivity跳转到twoActivity时,即使做了资源释放,跳转时twoActivity摄像头正常,但back回oneActivity时,oneActivity摄像头异常(画面不动),按home后(执行onResume)后正常,可刚刚按back时执行了onResume了的。可当twoActivity为普通活动时,又一切正常~~~

再次认识活动的生命周期

一 返回栈
1.定义: Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动 的集合这个栈也被称作返回栈(Back Stack)。
2.栈顶:存放刚启动的一个新的活动。(当我们 按下 Back键或调用 finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入 栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。)

二 活动状态
1.运行状态:活动位于返回栈的栈顶时(系统最不愿意回收的 就是处于运行状态的活动,因为这会带来非常差的用户体验。)

2.暂停状态:当一个活动不再处于栈顶位置,但仍然可见时(比如某个活动上面新开了个对话框活动该活动就是暂停活动-系统也不愿意去回收这 种活动。)

3.停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。(系统 仍然会为这种活动保存相应的状态和成员变量,但很容易被回收)

4.销毁状态:当一个活动从返回栈中移除后就变成了销毁状态(系统会最倾向于回收处于这种状 态的活动,从而保证手机的内存充足。)

三 创建活动的生存期
1.onCreate():它会在活动 第一次被创建的时候调用用于加载布局、绑定事件等。

2.onStart():这个方法在活动由不可见变为可见的时候调用。

3.onResume():这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的 栈顶,并且处于运行状态。

4.onPause(): 这个方法在系统准备去启动或者恢复另一个活动的时候调用。

5.onStop(): 这个方法在活动完全不可见的时候调用。-----(如 果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop() 方法并不会执行。)。

6.onDestroy():这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

7.onRestart():活动被重新启动时调用。

完整生存期:【 onCreate()~ onDestroy()】之间。
可见生存期:【 onStart()~ onStop()】之间。活动对于用户总是可见的!(我们可以通过这两个方法对资源进行加载和释放)
前台生存期:【 onResume()~ onPause()】之间。活动总是处于运行状态的!(可以和用户进行相互。)

演绎

重温以上知识点后重新演绎上述场景,
twoActivity为正常活动时
MainActivity 执行:
onCreate()
onStart()
onResume() 方法
然后点击第一个按钮启动 NormalActivity:(由于 NormalActivity已经把 MainActivity完全遮挡住,)
执行:
onPause()
onStop()
然后按下 Back键返回 MainActivity(由于之前 MainActivity已经进入了停止状态)
执行:
onRestart()
onStart()
onResume()

twoActivity为对话框活动时
然后再点击第二个按钮,启动 DialogActivity(DialogActivity并没有完全遮挡住 MainActivity)
执行:
onPause()
Back键返回 MainActivity
执行:
onResume()
最后在 MainActivity按下 Back键退出程序
执行:
onPause()
onStop()
onDestroy()

结论dialogActivity不会执行onStop、onRestart()、 onStart(),导致相机资源没有正常回调(也许可以通过修改相机类修复)
下面是项目中(asrDemo→DetectLoginActivity)生命周期log:

可见在这台设备上,在执行AsrDemo onPause后就执行了DetectLoginActivity onCreate,如果没有合理释放资源必然出现占用错误(camera can not connect 等...)
当DetectLoginActivity为对话框式活动时生命周期log:

这次跳转过程asrDemo中camera并没有回调发生
在asrDemo、DetectLoginActivity中camera释放放在onPause(),以在asrDemo跳转和DetectLoginActivity back时释放。

小结

关于如何解决在有camera活动打开另一个camera活动,且第二个又是DialogActivity,中的camera正常调用问题?
本次项目做法是将第二个活动改为普通活动(黑线~)
有大佬说可以把dialogActivity改为DialogFragment,生命周期就正常了,自己做了尝试,跟继承Dialog类似,由于项目设计代码较多且是引用的,半途中止,先实现功能再说,后面自己写时尝试再使用DialogFragment看看效果