我一直在尝试实现一个应用程序,需要在一个表面上的相机预览。 在我看来,活动和表面生命周期都由以下状态组成:
onResume()->onSurfaceCreated()->onSurfaceChanged()
onPause()->onSurfaceDestroyed()
在这个方案中,我可以在 onPause/onResume
和 onSurfaceCreated()/onSurfaceDestroyed()
中进行相应的调用,如打开/释放摄像头和开始/停止预览。
没问题,除非我把屏幕锁上。当我启动应用程序,然后锁定屏幕和解锁后,我看到:
屏幕锁定后没有其他东西,解锁后 onResume()
也没有表面回调。实际上,在按下电源按钮并打开屏幕之后,就会调用 onResume()
,但是锁定屏幕仍然处于活动状态,所以,这是在活动变得甚至可见之前。
使用这个方案,解锁后我会得到一个黑屏,而且不会调用表面回调。
下面的代码片段并不涉及摄像机的实际工作,而是 SurfaceHolder
回调。即使在我的手机上使用这段代码,上面的问题还是重现了(当你按下“后退”按钮时,回调按正常顺序被调用,但是当你锁定屏幕时,回调就不见了) :
class Preview extends SurfaceView implements SurfaceHolder.Callback {
private static final String tag= "Preview";
public Preview(Context context) {
super(context);
Log.d(tag, "Preview()");
SurfaceHolder holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.d(tag, "surfaceCreated");
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d(tag, "surfaceDestroyed");
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Log.d(tag, "surfaceChanged");
}
}
关于为什么活动暂停后表面仍然没有被破坏,有什么想法吗?此外,在这种情况下,您如何处理相机的生命周期?