Я пытался реализовать приложение, которое требует предварительного просмотра камеры на поверхности. Насколько я понимаю, жизненные циклы как активности, так и поверхности состоят из следующих состояний:
onResume()->onSurfaceCreated()->onSurfaceChanged()
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");
}
}
Любые идеи о том, почему поверхность остается неповрежденной после приостановки действия? Кроме того, как вы справляетесь с жизненным циклом камеры в таких случаях?