Jak pisałem szukałem i wyszło mi, że najlepszy jest wariant z oddzielnymi Activity. Więc jak piszesz, ale z małą różnicą - sam robię coś na wzór Activity Stack. Twój wariant byłby ok, ale ciężko byłoby np. zrobić wariant taki: A - to widok kategorii, B - widok podkategorii, C - widok transakcji z danej kategorii/podkategorii - user może przejść A -> B -> C (czyli w C widzi transakcje z podkategorii wybranej w B), ale mógłby też chcieć zobaczyć transakcje z kategorii, czyli od razu z A do C i tu zaczęłyby się schody (typ poprzedniego widok w parametrach, itd., troszkę kombinowania, a i tak by się do końca nie sprawdziło gdyby stos był dłuższy 🙂 ). Zrobiłem to mniej więcej tak:
X nie jest niszczone, to główne Activity aplikacji i nie chce go niszczyć,
w X wywołuję funkcję która odpalam A,
w A kliknięcie w funkcji "pokaż szczegóły" powoduje zachowanie aktualnego Intenta z Activity w statycznym stosie Intentów oraz stworzenie nowego Intenta odpalającego ponownie to samo Activity, ale ze skopiowanymi parametrami plus nowe parametry (tj. np. szczegóły której kategorii mają być pokazane), następnie tym nowym Intentem odpalam nowe Activity czyli B i jednocześnie zamykam obecne tj. A - w pierwszym wariancie nie zamykałem obecnego, tylko nowe odpalałem z flagą FLAG_ACTIVITY_CLEAR_TOP - wszystko robiłem na jednym Activity, ale obecnie są to różne Activity wywodzące się z jednej klasy bazowej - dzięki temu unikam masy warunków "tryb taki, zrób to, tryb inny, zrób tamto",
w B i C sytuacja wygląda analogicznie jak wyżej, poprzedni Intent leci na mój stos,
gdy chce cofnąć się np. z C do B w zdarzeniu onBackPressed na podstawie ostatniego Intenta ze stosu odpalam Activity (samo zdarzenie zamyka C, ja odpalam B) - ze stosu Intent oczywiście jest usuwany,
jeśli chce zamknąć raport i wrócić z dowolnego A, B, C do X po prostu zamykam aktualne Activity bez powyżej obsługi onBackPressed.
Przejścia pomiędzy Activity załatwiłem poprzez animacje (overridePendingTransition), inna wchodząc "w dół" (bardziej szczegółowy widok), inna wychodząc. Stos to zwykła klasa Stack<Intent>, sam stos jest niszczony gdy jest już zbędny (dzięki licznikowi odwołań). Efekt jest taki o jaki mi chodziło, więc temat można uznać za rozwiązany 🙂 .