Wie hängen SurfaceHolder-Rückrufe mit dem Aktivitätslebenszyklus zusammen?

Ich habe versucht, eine Anwendung zu implementieren, die eine Kameravorschau auf einer Oberfläche erfordert. Wie ich die Dinge sehe, bestehen sowohl die Aktivität als auch der Oberflächenlebenszyklus aus den folgenden Zuständen:

Wenn ich meine Aktivität zum ersten Mal starte:onResume()->onSurfaceCreated()->onSurfaceChanged()Wenn ich meine Tätigkeit verlasse:onPause()->onSurfaceDestroyed()

In diesem Schema kann ich entsprechende Aufrufe wie Kamera öffnen / freigeben und Vorschau starten / stoppen inonPause/onResume undonSurfaceCreated()/onSurfaceDestroyed().

Es funktioniert gut, es sei denn, ich sperre den Bildschirm. Wenn ich die App starte, sperre ich den Bildschirm und entsperre ihn später. Ich sehe:

onPause() - und sonst nichts, nachdem der Bildschirm gesperrt ist - dannonResume() nach dem entsperren - und keine oberflächenrückrufe danach. Tatsächlich,onResume() wird aufgerufen, nachdem der Ein- / Ausschalter gedrückt wurde und der Bildschirm eingeschaltet ist, der Sperrbildschirm jedoch noch aktiv ist. Das heißt, bevor die Aktivität überhaupt sichtbar wird.

Bei diesem Schema wird nach dem Entsperren ein schwarzer Bildschirm angezeigt, und es werden keine Oberflächenrückrufe aufgerufen.

Hier ist ein Codefragment, das keine eigentliche Arbeit mit der Kamera beinhaltet, sondern dieSurfaceHolder Rückrufe. Das obige Problem wird auch mit diesem Code auf meinem Telefon reproduziert (Rückrufe werden in einer normalen Reihenfolge aufgerufen, wenn Sie die Taste "Zurück" drücken, fehlen jedoch, wenn Sie den Bildschirm sperren):

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

Gibt es Ideen, warum die Oberfläche nach dem Anhalten der Aktivität nicht zerstört wird? Wie gehen Sie in solchen Fällen mit dem Lebenszyklus der Kamera um?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage