Jak przenieść działanie na pierwszy plan (szczyt stosu)?

91

W Androidzie zdefiniowałem działanie ExampleActivity.

Kiedy moja aplikacja została uruchomiona instancja tego A-Activity został stworzony, powiedzieć, że jest A. Gdy użytkownik kliknął przycisk w A, została utworzona kolejna instancja B-Activity, B. Teraz stos zadań to BA, z B na górze. Następnie użytkownik kliknął przycisk na B, kolejne wystąpienie C-Activity i zostało utworzone C. Teraz stos zadań to CBA, z C na górze.

Teraz, gdy użytkownik kliknie przycisk na C, chcę, aby aplikacja wyprowadziła A na pierwszy plan, tj. Uczyniła A na szczycie stosu zadań, ACB.

Jak napisać kod, aby to się stało?

user256239
źródło

Odpowiedzi:

109

Możesz spróbować FLAG_ACTIVITY_REORDER_TO_FRONT(dokument dokładnie opisuje, czego chcesz)

Reno
źródło
3
Myślę, że powinno to być FLAG_ACTIVITY_SINGLE_TOP .
26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPnie pomoże tutaj. Gdy ActivityC znajduje się na szczycie stosu i wywołujestartActivity() uruchomienie ActivityA, nawet jeśli ustawisz FLAG_ACTIVITY_SINGLE_TOP, nadal utworzy nowe wystąpienie ActivityA. FLAG_ACTIVITY_SINGLE_TOPzapobiega tworzeniu nowej instancji tylko wtedy, gdy próbujesz uruchomić działanie, które znajduje się już na szczycie stosu . W tym przypadku ActivityA nie znajduje się na szczycie stosu, więc system Android tworzy nowe wystąpienie.
David Wasser,
6
Niesamowite! Służy (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)do usuwania historii po danym Activity.
shkschneider
10
FLAG_ACTIVITY_REORDER_TO_FRONT jest ignorowane, jeśli określisz również FLAG_ACTIVITY_CLEAR_TOP. Sprawdź dokumentację.
Kris Subramanian
3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); To zadziała dobrze, jeśli chcesz przenieść swoją aktywność na pierwszy plan z sesją użytkownika, jeśli jest już na szczycie stosu, ale nie na początku.
Hassan Jamil
64

Najlepszym sposobem, w jaki udało mi się to zrobić, było wykorzystanie tego samego celu, którego używa ekran główny Androida - programu uruchamiającego aplikacje.

Na przykład:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

W ten sposób każda aktywność w moim pakiecie była ostatnio używana przez użytkownika, jest ponownie przenoszona na pierwszy plan. Zauważyłem, że jest to przydatne w korzystaniu z PendingIntent mojej usługi, aby przywrócić użytkownika do mojej aplikacji.

greg7gkb
źródło
2
Wielkie dzięki za ten fragment kodu. Zmarnowałem godziny, próbując to naprawić.
PakitoV
3
lub bez ComponentName i setComponent, ale z nowym Intentem (this, MyMainActivity.class)
Tima
3
Dziwne, bo to była jedyna rzecz, która działała dla mnie; ustawienie flag nie działało i zawsze odtwarzało działanie.
Steven Huang
5
Kiedy czytam tę odpowiedź i komentarze, jest jasne, że mamy nieporozumienie. Pierwotne pytanie dotyczy tego, jak zmienić układ Activityw stosie zadań. OP wyraźnie stwierdza, że ​​chce przejść ActivityAz dołu stosu na szczyt stosu (tj .: chce zmienić kolejność Działania A na początek stosu zadań ). Ta odpowiedź nie wystarczy. Ta odpowiedź jest odpowiedzią na pytanie "Jak mogę przenieść moją aplikację (stos zadań) z tła na pierwszy plan?" To zupełnie inne pytanie niż pierwotne pytanie OP.
David Wasser,
3
Również przycisk „upvote” mówi „Ta odpowiedź jest pomocna” nie ”ta odpowiedź jest pomocna dla operatora - on / ona ma już„ akceptację ”dla tej sytuacji. Oczywiście nie wiem, co jest pomocne dla operacji, a odpowiedzi IMHO w dół na podstawie mojego zgadywania, co jest pomocne dla op, jest nieprawidłowe.
Boris Treukhov
28

Oto przykład kodu pokazujący, jak możesz to zrobić:

Intent intent = getIntent(getApplicationContext(), A.class)

Dzięki temu masz tylko jedno wystąpienie działania na stosie.

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}
Jan-Terje Sørensen
źródło
11

FLAG_ACTIVITY_REORDER_TO_FRONT : Jeśli jest ustawiona w intencji przekazanej do Context.startActivity (), ta flaga spowoduje, że uruchomione działanie zostanie przeniesione na początek stosu historii zadania, jeśli jest już uruchomione.

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
FunGapApp
źródło
4

Myślę, że połączenie Intentflag powinno załatwić sprawę. W szczególności Intent.FLAG_ACTIVITY_CLEAR_TOPi Intent.FLAG_ACTIVITY_NEW_TASK.

Dodaj te flagi do swoich zamiarów przed wywołaniem startActvity.

Glin.
źródło
2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Uwaga: Twoim trybem uruchamiania aktywności domowej powinno być single_task

sujith s
źródło
1

Generalnie uważam, że ta metoda zarządzania działalnością nie jest zalecana. Problem z reaktywacją czynności o dwa kroki w dół w stosie polega na tym, że prawdopodobnie została ona zabita. Radzę zapamiętywać stan swoich działań i uruchamiać je za pomocąstartActivity ()

Jestem pewien, że widziałeś tę stronę, ale dla Twojej wygody ten link

Segfault
źródło
0

Jeśli chcesz przenieść działanie na szczyt stosu po kliknięciu powiadomienia, może być konieczne wykonanie następujących czynności, aby FLAG_ACTIVITY_REORDER_TO_FRONT działało:

Rozwiązaniem dla mnie było stworzenie odbiornika, który nasłuchuje akcji nadawczych, które wyzwala powiadomienie. Więc w zasadzie:

  1. Powiadomienie wyzwala akcję rozgłoszeniową z dodatkową nazwą działania do uruchomienia.

  2. Odbiornik transmisji przechwytuje to po kliknięciu powiadomienia, a następnie tworzy zamiar uruchomienia tej czynności za pomocą flagi FLAG_ACTIVITY_REORDER_TO_FRONT

  3. Aktywność jest umieszczana na szczycie stosu aktywności, bez duplikatów.

sakis kaliakoudas
źródło
-2

Jeśli używasz „Google Cloud Message” do otrzymywania powiadomień push z klasą „PendingIntent”, poniższy kod wyświetla powiadomienie tylko na pasku akcji.

Po kliknięciu powiadomienia żadna czynność nie zostanie utworzona, ostatnia aktywna czynność zostanie przywrócona z zachowaniem aktualnego stanu bez problemów.

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

Cześć!

GFPF
źródło