Jak wywołania zwrotne SurfaceHolder są związane z cyklem życia Aktywności?

Próbowałem zaimplementować aplikację, która wymaga podglądu kamery na powierzchni. Jak widzę, zarówno aktywność, jak i cykle życia powierzchni składają się z następujących stanów:

Kiedy po raz pierwszy uruchamiam moją działalność:onResume()->onSurfaceCreated()->onSurfaceChanged()Kiedy opuszczam moją działalność:onPause()->onSurfaceDestroyed()

W tym schemacie mogę wykonywać odpowiednie połączenia, takie jak otwieranie / zwalnianie kamery i uruchamianie / zatrzymywanie podglądu wonPause/onResume ionSurfaceCreated()/onSurfaceDestroyed().

Działa dobrze, chyba że zablokuję ekran. Po uruchomieniu aplikacji zablokuj ekran i odblokuj go później. Widzę:

onPause() - i nic innego po zablokowaniu ekranu - wtedyonResume() po odblokowaniu - i po tym nie ma wywołań zwrotnych na powierzchni. Tak właściwie,onResume() jest wywoływany po naciśnięciu przycisku zasilania i włączeniu ekranu, ale ekran blokady jest nadal aktywny, więc zanim aktywność stanie się widoczna.

Dzięki temu schematowi otrzymuję czarny ekran po odblokowaniu i nie są wywoływane żadne wywołania zwrotne powierzchni.

Oto fragment kodu, który nie wymaga rzeczywistej pracy z kamerą, aleSurfaceHolder wywołania zwrotne. Powyższy problem jest odtwarzany nawet z tym kodem w moim telefonie (wywołania zwrotne są wywoływane w normalnej kolejności po naciśnięciu przycisku „Wstecz”, ale brakuje ich po zablokowaniu ekranu):

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

Jakieś pomysły, dlaczego powierzchnia pozostaje niezniszczona po wstrzymaniu działania? W jaki sposób radzisz sobie z cyklem życia aparatu w takich przypadkach?

questionAnswers(5)

yourAnswerToTheQuestion