Как обратные вызовы SurfaceHolder связаны с жизненным циклом Activity?
Я пытался реализовать приложение, которое требует предварительного просмотра камеры на поверхности. Как я вижу, жизненный цикл активности и поверхности состоит из следующих состояний:
When I first launch my Activity:onResume()->onSurfaceCreated()->onSurfaceChanged()
When I leave my Activity: onPause()->onSurfaceDestroyed()
В этой схеме я могу делать соответствующие вызовы, такие как открыть / отпустить камеру и запустить / остановить предварительный просмотр вonPause/onResume
а такжеonSurfaceCreated()/onSurfaceDestroyed()
.
Работает нормально, если я не заблокирую экран. Когда я запускаю приложение, затем блокирую экран и разблокирую его позже, я вижу:
onPause()
- и ничего после того, как экран заблокирован - тогда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");
}
}
Любые идеи о том, почему поверхность остается неразрушенной после приостановки деятельности? Кроме того, как вы справляетесь с жизненным циклом камеры в таких случаях?