1

я получаю неожиданное поведение:Когда я приношу мое приложение на переднем плане загрузки это не распространяется последнюю активность

  • активность А = активность Launcher
  • активность B = Это начинается с уведомления

Когда я закрыл приложение и откройте его из уведомления, начнется действие B.

Итак, когда я нажимаю кнопку HOME, приложение переходит к Activity A. Затем я нажимаю кнопку BACK, и приложение переходит в фоновый режим, и я получаю главный экран Android.

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

Намерение набор в уведомлении строителя:

Intent intent = new Intent(this, ActivityB.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 

В активность B у меня есть:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (id == android.R.id.home) { 
     Intent intent = new Intent(ActivityB.this, ActivityA.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(intent); 
    } 

Любая идея или предложение?

+0

делает это происходит каждый раз или только после того, как вы нажмете push и загрузите приложение? \ –

+0

Только когда я запускаю Activity B из push-уведомления. –

+0

используйте '.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);' и скажите мне, работает ли это! –

ответ

1

Я нашел решение, которое соответствует тому, что я ожидаю. Когда я получаю уведомление я создаю новый Целевой Stack с моим mainActivity на вершине:

Intent intent = new Intent(this, ActivityB.class); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
stackBuilder.addParentStack(ActivityB.class); 
stackBuilder.addNextIntent(intent); 

PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

Теперь я могу также удалить перекрытую проверку на кнопку HOME в активности B:

// This can be now removed 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
if (id == android.R.id.home) { 
    Intent intent = new Intent(ActivityB.this, ActivityA.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
} 
0

Вместо этого вы можете использовать флаг FLAG_ACTIVITY_REORDER_TO_FRONT, который будет изменять порядок действий, а не FLAG_ACTIVITY_CLEAR_TOP, который удалит другие действия поверх него.

Например, при использовании FLAG_ACTIVITY_REORDER_TO_FRONT

рассмотрит задачу, состоящую из четырех видов деятельности: A, B, C, D. Если D звонит startActivity() с Intent, который разрешает компонент активности B, то B будет перенесен в переднюю часть стека истории, с этим результатом будет: A, C, D, B. Этот флаг будет проигнорирован, если также указан FLAG_ACTIVITY_CLEAR_TOP.

вы можете обратиться к этой ссылке: https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

+0

Я думаю, что это не решит проблему. Если приложение закрыто, у меня нет задач для изменения порядка, поэтому я получаю такое же поведение, не так ли? –

1

Причина этого в том, что задача, которая находится в списке последних задач был запущен из Notification с ActivityB как корень Activity. Если вы выберете эту задачу из списка недавних задач, Android перенесет существующую задачу на передний план. Однако, если в задании нет активных действий (все действия завершены), тогда Android снова запустит корневой каталог Activity.

Необходимо, чтобы приложение не было добавлено в список последних заданий , если оно запущено от Notification. Вы можете сделать это, добавив:

android:excludeFromRecents="true" 

к манифесту записи для ActivityB.

+0

То, что вы говорите, имеет смысл. Как я могу исключить из этой кампании наемников только тогда, когда она начинается с уведомления? –

+0

Делая то, что я сказал. Поскольку ваша нормальная активация 'Activity' является' ActivityA', приложение будет отображаться в списке ретентатов, когда оно будет запущено с помощью 'ActivityA', но не тогда, когда оно будет запущено с помощью' ActivityB'. –

+0

О, ты прав. Ваше решение работает. Но было бы здорово, если бы я мог получить основную активность от выходцев из поляков. –