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?
android
android-intent
android-activity
user256239
źródło
źródło
FLAG_ACTIVITY_SINGLE_TOP
nie pomoże tutaj. Gdy ActivityC znajduje się na szczycie stosu i wywołujestartActivity()
uruchomienie ActivityA, nawet jeśli ustawiszFLAG_ACTIVITY_SINGLE_TOP
, nadal utworzy nowe wystąpienie ActivityA.FLAG_ACTIVITY_SINGLE_TOP
zapobiega 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.(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)
do usuwania historii po danymActivity
.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.
źródło
Activity
w stosie zadań. OP wyraźnie stwierdza, że chce przejśćActivityA
z 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.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; }
źródło
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);
źródło
Myślę, że połączenie
Intent
flag powinno załatwić sprawę. W szczególnościIntent.FLAG_ACTIVITY_CLEAR_TOP
iIntent.FLAG_ACTIVITY_NEW_TASK
.Dodaj te flagi do swoich zamiarów przed wywołaniem
startActvity
.źródło
i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
Uwaga: Twoim trybem uruchamiania aktywności domowej powinno być single_task
źródło
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
źródło
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:
Powiadomienie wyzwala akcję rozgłoszeniową z dodatkową nazwą działania do uruchomienia.
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
Aktywność jest umieszczana na szczycie stosu aktywności, bez duplikatów.
źródło
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ść!
źródło