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?