Як вивести діяльність на передній план (верх стека)?


91

В Android я визначив діяльність ExampleActivity.

Коли мою програму було запущено, приклад цієї A-Activity був створений, скажімо так A. Коли користувач натиснув кнопку A, був створений інший екземпляр B-Activity, B. Тепер стек завдань BA, з B вгорі. Потім користувач натиснув кнопку на B, інший примірник C-Activity, і C було створено. Тепер стек завдань - CBA, зверху C.

Тепер, коли користувач натискає кнопку на C, я хочу, щоб програма висунула A на передній план, тобто зробила A, щоб вона знаходилась у верхній частині стеку завдань, ACB.

Як я можу написати код, щоб це сталося?

Відповіді:


109

Ви можете спробувати це FLAG_ACTIVITY_REORDER_TO_FRONT(документ точно описує те, що ви хочете)


3
Я думаю, це має бути FLAG_ACTIVITY_SINGLE_TOP .

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPтут не допоможе. Коли ActivityC знаходиться у верхній частині стека і він закликає startActivity()запустити ActivityA, навіть якщо ви встановите FLAG_ACTIVITY_SINGLE_TOPце, він все одно створить новий екземпляр ActivityA. FLAG_ACTIVITY_SINGLE_TOPлише перешкоджає створенню нового екземпляра, якщо ви намагаєтеся запустити діяльність, яка вже знаходиться у верхній частині стека . У цьому випадку ActivityA не знаходиться у верхній частині стеку, тому Android створює новий екземпляр.
Девід Вассер

6
Чудово! Використовується (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)для очищення будь-якої історії після заданого Activity.
shkschneider

10
FLAG_ACTIVITY_REORDER_TO_FRONT ігнорується, якщо ви також вказали FLAG_ACTIVITY_CLEAR_TOP. Перевірте документацію.
Kris Subramanian

3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Це буде добре працювати, якщо ви хочете, щоб ваша активність була передньою з користувальницькою сесією, якщо вона вже перебуває у верхній частині задньої панелі, але не на передній.
Хасан Джаміль

64

Найкращий спосіб, який я знайшов, - це використовувати той самий намір, що і головний екран Android - додаток Launcher.

Наприклад:

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

Таким чином, будь-яка діяльність у моєму пакеті, якою користувач користувався нещодавно, знову повертається наперед. Я знайшов це корисним у використанні PendingIntent мого сервісу для повернення користувача до мого додатка.


2
Велике спасибі за цей фрагмент коду. Я витрачав години, намагаючись налагодити роботу.
PakitoV

3
або без ComponentName і setComponent, але з новим Intent (this, MyMainActivity.class)
Tima

3
Дивно, як це єдине, що працювало у мене; встановлення прапорів не працювало і завжди відтворювало діяльність.
Стівен Хуан

5
Коли я читаю цю відповідь та коментарі, стає зрозуміло, що ми маємо непорозуміння. Оригінальне запитання - про те, як переставити Activityвсередині стека завдань. OP чітко заявляє, що він хоче перейти ActivityAвід нижньої частини стека до верхньої частини стека (тобто: він хоче змінити порядок ActivityA до передньої частини стека завдань ). Ця відповідь цього не зробить. Ця відповідь є відповіддю на запитання "Як я можу перенести свою програму (стек завдань) із заднього плану на перший план?" Це зовсім інше питання від оригінального питання ОП.
Девід Вассер

3
Також кнопка за підтримку голосу говорить "Ця відповідь корисна", а не "ця відповідь корисна для оператора" - він / вона вже має "знак прийняття" для цієї ситуації. Очевидно, я не знаю, що корисно для оперативної роботи, і відповіді IMHO проти голосування на основі моїх здогадок, що корисно для операційної діяльності, є неправильними.
Борис Треухов

28

Ось приклад коду того, як ви можете це зробити:

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

Це гарантує, що у вас є лише один екземпляр дії у стеку.

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}

11

FLAG_ACTIVITY_REORDER_TO_FRONT : Якщо встановлено в Intent, переданому Context.startActivity (), цей прапор призведе до того, що запущена активність буде перенесена в передній частині стека історії свого завдання, якщо вона вже запущена.

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);

4

Я думаю, що комбінація Intentпрапорів повинна зробити трюк. Зокрема, Intent.FLAG_ACTIVITY_CLEAR_TOPіIntent.FLAG_ACTIVITY_NEW_TASK .

Додайте ці прапори до свого наміру перед дзвінком startActvity.


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Примітка. Ваш режим запуску домашньої активності повинен бути single_task


1

Загалом, я вважаю, що такий метод управління діяльністю не рекомендується. Проблема з повторною активацією активності на два кроки в стеці полягає в тому, що ця діяльність, ймовірно, була вбита. Моя порада - пам’ятайте про стан своєї діяльності та запускайте їх за допомогоюstartActivity ()

Я впевнений, що ви бачили цю сторінку, але для вашої зручності це посилання


0

Якщо ви хочете перенести активність у верх стека, натиснувши Повідомлення, можливо, вам доведеться зробити наступне, щоб FLAG_ACTIVITY_REORDER_TO_FRONT працював:

Для мене рішенням цього було зробити трансляційний приймач, який слухає трансляційні дії, які викликає сповіщення. Отже, в основному:

  1. Повідомлення запускає трансляційну дію з додатковою назвою діяльності, яку потрібно запустити.

  2. Широкомовний приймач ловить це, коли натискається повідомлення, а потім створює намір запустити цю діяльність за допомогою прапора FLAG_ACTIVITY_REORDER_TO_FRONT

  3. Діяльність розміщується у верхній частині стеку дій, без дублікатів.


-2

якщо ви використовуєте "Google Cloud Message" для отримання push-сповіщень із класом "PendingIntent", наступний код відображає сповіщення лише на панелі дій.

При натисканні на повідомлення не буде створено жодної активності, остання активна дія відновлена, зберігаючи поточний стан без проблем.

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());

Цао!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.