¿Cómo están relacionadas las devoluciones de llamada de SurfaceHolder con el ciclo de vida de la actividad?

He estado intentando implementar una aplicación que requiere una vista previa de la cámara en una superficie. Como veo las cosas, los ciclos de vida de la actividad y la superficie constan de los siguientes estados:

Cuando lanzo mi actividad por primera vez:onResume()->onSurfaceCreated()->onSurfaceChanged()Cuando salgo de mi actividad:onPause()->onSurfaceDestroyed()

En este esquema, puedo hacer las llamadas correspondientes como abrir / liberar la cámara y comenzar / detener la vista previa enonPause/onResume yonSurfaceCreated()/onSurfaceDestroyed().

Funciona bien, a menos que bloquee la pantalla. Cuando lanzo la aplicación, luego bloqueo la pantalla y la desbloqueo más tarde, veo:

onPause() - y nada más después de que la pantalla esté bloqueada - entoncesonResume() después de desbloquear - y no hay devoluciones de llamada de superficie después de eso. Actualmente,onResume() se llama después de presionar el botón de encendido y la pantalla está encendida, pero la pantalla de bloqueo aún está activa, por lo tanto, es antes de que la actividad sea visible.

Con este esquema, obtengo una pantalla negra después del desbloqueo, y no se llaman devoluciones de llamada de superficie.

Aquí hay un fragmento de código que no implica trabajo real con la cámara, pero elSurfaceHolder devoluciones de llamada El problema anterior se reproduce incluso con este código en mi teléfono (las devoluciones de llamada se llaman en una secuencia normal cuando se presiona el botón "Atrás", pero faltan cuando se bloquea la pantalla):

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");
    }
}

¿Alguna idea sobre por qué la superficie permanece sin destruir después de que la Actividad se detiene? Además, ¿cómo maneja el ciclo de vida de la cámara en tales casos?

Respuestas a la pregunta(5)

Su respuesta a la pregunta