Jak przenieść działanie na pierwszy plan (górę stosu)?

W Androidzie zdefiniowałem przykład aktywności.

Kiedy moja aplikacja została uruchomiona, powstała instancja tego działania A, powiedzmy, że jest to A. Gdy użytkownik kliknął przycisk w A, powstała kolejna instancja B-Activity, B. Teraz stos zadań to B-A, Z B na górze. Następnie użytkownik kliknął przycisk na B, Inna instancja C-Activity I C został utworzony. Teraz stos zadań to C-B-A, Z C na górze.

Teraz, gdy użytkownik kliknie przycisk na C, chcę aplikacja do wyprowadzenia A na pierwszy plan, tzn. aby a było na szczycie stosu zadań, A-C-B.

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

Author: Eric Leschinski, 2010-02-09

9 answers

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

 86
Author: Reno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 03:18:16

Najlepszym sposobem, który znalazłem, aby to zrobić, było użycie tej samej intencji, z której korzysta Ekran główny Androida - Launcher aplikacji.

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żyta przez użytkownika, jest ponownie przenoszona na front. Uznałem to za przydatne w korzystaniu z PendingIntent mojej usługi, aby przywrócić użytkownika do mojej aplikacji.

 53
Author: greg7gkb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-18 00:23:40

Oto kod-przykład jak możesz to zrobić:

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

To upewni się, że masz tylko jedną instancję aktywności 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;
}
 20
Author: Jan-Terje Sørensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-13 11:36:59

FLAG_ACTIVITY_REORDER_TO_FRONT : Jeśli jest ustawiona w intencji przekazanej do kontekstu.startActivity(), flaga ta spowoduje, że uruchomiona aktywność zostanie przeniesiona na początek stosu historii zadania, jeśli jest już uruchomiona.

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
 6
Author: FunGapApp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-16 13:35:25

Myślę, że kombinacja Intent FLAG powinna załatwić sprawę. W szczególności, Intent.FLAG_ACTIVITY_CLEAR_TOP i Intent.FLAG_ACTIVITY_NEW_TASK.

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

 4
Author: Al.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 03:19:02

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Zwróć uwagę, że Twój launchmode startowy powinien być single_task

 2
Author: sujith s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-15 13:07:27

Ogólnie uważam, że ta metoda zarządzania aktywnością nie jest zalecana. Problem z reaktywacją aktywności dwa kroki w dół w stosie jest to, że aktywność ta została prawdopodobnie zabita. Moja rada, aby zapamiętać stan swoich działań i uruchomić je z startActivity ()

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

 1
Author: Segfault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 03:19:58

Jeśli chcesz przenieść aktywność na górę 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 nadawczego, który nasłuchuje akcji nadawczych wyzwalanych przez powiadomienie. Więc w zasadzie:

  1. Powiadomienie uruchamia akcję rozgłoszeniową z dodatkową nazwą aktywności do uruchomienia.

  2. Odbiornik Radiowy po kliknięciu powiadomienia tworzy się zamiar uruchomienia tej aktywności przy użyciu flagi FLAG_ACTIVITY_REORDER_TO_FRONT

  3. Aktywność jest przenoszona na szczyt stosu aktywności, bez duplikatów.

 0
Author: sakis kaliakoudas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 20:08:24

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

Kliknięcie powiadomienia nie spowoduje utworzenia żadnej aktywności, ostatnia aktywna aktywność zostanie przywrócona, zachowując aktualny stan 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());

Ciao!
 -1
Author: GFPF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 07:26:54