Как обратные вызовы 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");
    }
}

Любые идеи о том, почему поверхность остается неразрушенной после приостановки деятельности? Кроме того, как вы справляетесь с жизненным циклом камеры в таких случаях?

Ответы на вопрос(5)

Ваш ответ на вопрос