Как вывести действие на передний план (верх стека)?

StackOverflow https://stackoverflow.com/questions/2232238

Вопрос

В Android я определил активность exampleActivity.

Когда мое приложение было запущено, был создан экземпляр этой A-Activity, скажем, A.Когда пользователь нажал кнопку в A, был создан еще один экземпляр B-Activity, B.Теперь стек задач имеет вид B-A, где B находится вверху.Затем пользователь нажал кнопку на B, еще один экземпляр C-Activity, и был создан C.Теперь стек задач имеет вид C-B-A, где C находится вверху.

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

Как я могу написать код, чтобы это произошло?

Это было полезно?

Решение

Вы можете попробовать это FLAG_ACTIVITY_REORDER_TO_FRONT (документ описывает именно то, что вы хотите)

Другие советы

Лучший способ, который я нашел для этого, — использовать то же назначение, что и главный экран Android — средство запуска приложений.

Например:

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

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

Вот пример кода того, как вы можете это сделать:

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;
}

FLAG_ACTIVITY_REORDER_TO_FRONT:Если этот флаг установлен в намерении, переданном в Context.startActivity(), этот флаг приведет к тому, что запущенное действие будет перенесено в начало стека истории его задачи, если оно уже запущено.

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

Я думаю, что сочетание Intent флаги должны помочь.В частности, Intent.FLAG_ACTIVITY_CLEAR_TOP и Intent.FLAG_ACTIVITY_NEW_TASK.

Добавьте эти флаги в свое намерение перед вызовом startActvity.

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Примечание. Ваш режим запуска домашней активности должен быть single_task.

В целом я считаю, что такой метод управления деятельностью не рекомендуется.Проблема с повторной активацией действия на два шага ниже в стеке заключается в том, что это действие, скорее всего, было уничтожено.Мой совет: помните о состоянии своих действий и запускайте их с помощью startActivity ()

Я уверен, что вы видели эту страницу, но для для вашего удобства эта ссылка

Если вы хотите перенести действие на вершину стека при нажатии на уведомление, вам может потребоваться сделать следующее, чтобы FLAG_ACTIVITY_REORDER_TO_FRONT работал:

Решением для меня было создание широковещательного приемника, который прослушивал бы широковещательные действия, запускаемые уведомлением.Итак, в основном:

  1. Уведомление запускает широковещательное действие с дополнительным названием запускаемого действия.

  2. Получатель широковещательной рассылки улавливает это при нажатии на уведомление, а затем создает намерение запустить это действие с помощью флага FLAG_ACTIVITY_REORDER_TO_FRONT.

  3. Активность выводится на вершину стека действий, дубликатов нет.

Если вы используете «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());

Чао!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top