В Android я определил действие ExampleActivity.
Когда мое приложение было запущено, был создан, скажем так, экземпляр этого A-Activity A
. Когда пользователь нажимал кнопку A
, был создан другой экземпляр B-Activity, B. Теперь стек задач - BA, с B наверху. Затем пользователь нажал кнопку на B, еще один экземпляр C-Activity, и был создан C. Теперь стек задач - CBA, с C наверху.
Теперь, когда пользователь нажимает кнопку на C, я хочу, чтобы приложение выводило A на передний план, то есть заставляло A быть на вершине стека задач, ACB.
Как я могу написать код, чтобы это произошло?
android
android-intent
android-activity
user256239
источник
источник
FLAG_ACTIVITY_SINGLE_TOP
здесь не поможет. Когда ActivityC находится наверху стека и вызываетstartActivity()
ActivityA, даже если вы установили,FLAG_ACTIVITY_SINGLE_TOP
он все равно создаст новый экземпляр ActivityA.FLAG_ACTIVITY_SINGLE_TOP
предотвращает создание нового экземпляра только в том случае, если вы пытаетесь запустить действие, которое уже находится на вершине стека . В этом случае ActivityA не находится на вершине стека, поэтому Android создает новый экземпляр.(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)
для очистки любой истории после заданногоActivity
.Лучшим способом, который я нашел для этого, было использование того же намерения, что и на домашнем экране Android, - средства запуска приложений.
Например:
Intent i = new Intent(this, MyMainActivity.class); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_LAUNCHER); startActivity(i);
Таким образом, все действия в моем пакете, которые последний раз использовались пользователем, снова возвращаются на передний план. Я нашел это полезным при использовании PendingIntent моей службы, чтобы вернуть пользователя в мое приложение.
источник
Activity
внутри стека задач. OP четко заявляет, что он хочет перейтиActivityA
от нижней части стека к верхней части стека (то есть: он хочет переупорядочить ActivityA в начало стека задач ). Этот ответ не поможет. Этот ответ является ответом на вопрос «Как вывести мое приложение (стек задач) из фона на передний план?» Это совершенно другой вопрос от исходного вопроса OP.Вот пример кода, как это можно сделать:
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 заработал:
Решением для меня было создание широковещательного приемника, который слушает широковещательные действия, запускаемые уведомлением. Итак, в основном:
Уведомление запускает широковещательное действие с дополнительным названием запускаемого действия.
Приемник широковещательной передачи улавливает это при нажатии на уведомление, а затем создает намерение запустить это действие, используя флаг FLAG_ACTIVITY_REORDER_TO_FRONT
Действие выводится на вершину стека действий, никаких дубликатов.
источник
если вы используете «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());
Чао!
источник