Подтвердить что ты не робот

Вернуться к основному виду деятельности, связанной с созданием уведомлений

Я пытаюсь реализовать описанное поведение здесь, где уведомление (или что-то другое) начинает "внутреннюю" активность в вашем приложении, а затем, когда пользователь нажал назад, он переходит в мою "домашнюю" активность.

В документах Android говорится

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

Есть ли хороший способ сделать это? Другие вопросы о Stackoverflow предполагают начало основной деятельности с намерением, которая подсказывает ему начать внутреннюю деятельность, но это кажется огромным взломом, что я несколько сомневаюсь, что Google использовал бы в Gmail, и я предполагаю, что есть приличный метод, данный что они выступают за поведение.

Итак, есть ли не хакерский способ сделать это?

4b9b3361

Ответ 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>