Вернуться к основному виду деятельности, связанной с созданием уведомлений
Я пытаюсь реализовать описанное поведение здесь, где уведомление (или что-то другое) начинает "внутреннюю" активность в вашем приложении, а затем, когда пользователь нажал назад, он переходит в мою "домашнюю" активность.
В документах Android говорится
В случае кнопки "Назад" вы должны сделать навигацию более предсказуемый , вставив в задний стек задачи полный вверх по пути навигации к верхнему экрану приложения. Это позволяет пользователям которые забыли, как они вошли в ваше приложение, чтобы перейти к приложению. верхний экран перед выходом.
Есть ли хороший способ сделать это? Другие вопросы о Stackoverflow предполагают начало основной деятельности с намерением, которая подсказывает ему начать внутреннюю деятельность, но это кажется огромным взломом, что я несколько сомневаюсь, что Google использовал бы в Gmail, и я предполагаю, что есть приличный метод, данный что они выступают за поведение.
Итак, есть ли не хакерский способ сделать это?
Ответы
Ответ 1
Ага, мне просто нужно использовать PendingIntent.getActivities()
вместо getActivity()
. Также стоит упомянуть TaskStackBuilder
Вот какой код:
Intent backIntent = new Intent(ctx, MainActivity.class);
backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent intent = new Intent(ctx, ConversationActivity.class);
intent.putExtra("whatever", whatever);
final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++,
new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT);
Просто протестировал его. Отлично работает. Сначала я подозревал, что может быть проблема, если приложение уже запущено, и вы переходите к уведомлению. То есть скажем, что ваш стек активности (верхний справа):
[MainActivity] [SomeActivity]
и вы нажмете уведомление для ConversationActivity
. Вы получите:?
[MainActivity] [SomeActivity] [MainActivity] [ConversationActivity]
Хорошо, получается, что вы волшебным образом получаете
[MainActivity] [SomeActivity] [ConversationActivity]
что я хотел, но я понятия не имею, как это происходит. Я не задал никаких специальных опций для каких-либо действий. О, хорошо!
Ответ 2
Я знаю два способа достижения этого:
- Запустите
home activity
изнутри, запущенного уведомлением. Это может стать довольно трюком, так как вам придется различать и отслеживать различные возможные точки входа.
- Вы всегда начинаете с вас
home activity
, который проверяет, запускается ли уведомление, а затем запускает notification activity
. Это обеспечивает согласованную точку входа, и задний стек будет там, когда пользователь нажимает клавишу "Вверх".
С уважением.
Ответ 3
Это решение отлично работает именно для этой проблемы
android:noHistory="true"
Ответ 4
Существует новое руководство о том, как это сделать, и оно предлагает несколько несколько разных практик, чем ответы выше:
https://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse
Заметьте, на самом деле не используйте 0
для вашего кода запроса в getPendingIntent
. Для меня любое число не 0 работало, но 0 привело к тому, что кнопка "Назад" просто перешла в панель запуска.
Ответ 5
Ницца.
Но имейте в виду, что это не работает в системе pre-3.0 (pre API level 11), поскольку PendingIntent.getActivities() там недоступен.
И это то же самое для построения стоп-кадра для доступа к активности из уведомления (через Intent), и кнопка обратной связи ведет себя согласованно с вашим приложением (например, активность активности возвращается к активности списка).
Ответ 6
Действия связаны с задачей, которая представляет собой не что иное, как группу действий в фоновом стеке. Когда вы открываете новое действие после щелчка уведомления, эта деятельность открывается как самостоятельная деятельность и вводится в новую задачу. Это означает, что присутствуют только активность уведомления и родительская активность.
Просто укажите режим запуска вашей деятельности как "стандартный" в файле манифеста, и он должен решить проблему.
Intent resultIntent = new Intent(getApplicationContext(),
ResultActivity.class);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(getApplicationContext(),0,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notId, mBuilder.build());
манифеста:
<activity
android:name="com.mns.exercisenotifications.ResultActivity"
android:label="@string/app_name"
android:launchMode="standard" > <---
<intent-filter>
<action android:name="com.mns.exercisenotifications.ResultActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>