Как обратные вызовы SurfaceHolder связаны с жизненным циклом Activity?

Я пытался реализовать приложение, которое требует предварительного просмотра камеры на поверхности. Насколько я понимаю, жизненные циклы как активности, так и поверхности состоят из следующих состояний:

  1. Когда я впервые запускаю свою активность:onResume()->onSurfaceCreated()->onSurfaceChanged()
  2. Когда я покидаю свою активность: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");
    }
}

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

70
задан krugloid 15 July 2012 в 21:40
поделиться