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



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



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



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



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

763   9  

9 ответов:

вы можете попробовать это 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: Если задано в намерении, переданном в контекст.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);

обратите внимание, что ваш homeactivity launchmode должен быть 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());

Чао!

Comments

    Ничего не найдено.