Como os retornos de chamada do SurfaceHolder estão relacionados ao ciclo de vida da atividade?

Eu tenho tentado implementar um aplicativo que requer visualização da câmera em uma superfície. Quando vejo as coisas, os ciclos de vida de atividade e de superfície consistem nos seguintes estados:

Quando eu inicio minha atividade pela primeira vez:onResume()->onSurfaceCreated()->onSurfaceChanged()Quando deixo minha atividade:onPause()->onSurfaceDestroyed()

Neste esquema, posso fazer chamadas correspondentes como abrir / liberar câmera e iniciar / parar a visualização emonPause/onResume eonSurfaceCreated()/onSurfaceDestroyed().

Funciona bem, a menos que eu tranque a tela. Quando eu lanço o aplicativo, em seguida, bloquear a tela e desbloqueá-lo mais tarde vejo:

onPause() - e nada mais depois que a tela está bloqueada - entãoonResume() após o desbloqueio - e não há retornos de chamada de superfície depois disso. Na realidade,onResume() é chamado depois que o botão liga / desliga é pressionado e a tela está ligada, mas a tela de bloqueio ainda está ativa, portanto, é antes que a atividade fique visível.

Com este esquema, recebo uma tela preta após o desbloqueio e não são chamados retornos de chamada de superfície.

Aqui está um fragmento de código que não envolve trabalho real com a câmera, mas oSurfaceHolder retornos de chamada. O problema acima é reproduzido mesmo com este código no meu telefone (chamadas de retorno são chamadas em uma seqüência normal quando você pressiona o botão "Voltar", mas estão faltando quando você bloquear a tela):

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

Alguma idéia de por que a superfície permanece não destruída após a atividade ser pausada? Além disso, como você lida com o ciclo de vida da câmera nesses casos?

questionAnswers(5)

yourAnswerToTheQuestion