Намерение возобновить ранее приостановленное действие (вызвано из уведомления)

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

                    notification = new Notification(R.drawable.icon,
                            "Notify",
                            System.currentTimeMillis());
                    notification.setLatestEventInfo(this, "App name",
                            "App message",
                            PendingIntent.getActivity(
                                    this, 0,
                                    new Intent(this, Main.class),
                                    PendingIntent.FLAG_CANCEL_CURRENT));
                    notification.flags |= Notification.FLAG_ONGOING_EVENT;
                    nManager.notify(0, notification);

Но когда пользователь нажимает, уведомление запускает новый экземпляр того же действия вместо того, который пользователь использовал раньше.

Я думаю, что это как-то связано с PendingIntent, но я не могу найти, как заставить это намерение возобновить ранее приостановленный экземпляр действия вместо создания нового экземпляра.

Спасибо.


person Jimix    schedule 09.03.2011    source источник
comment
вы нашли решение этой проблемы? то, что я нашел, является обходным путем: все действия расширяют базовое действие для хранения количества активных действий (+1 для onCreate, -1 для onDestroy), а уведомление запускает фальшивое действие, которое выполняется в новой задаче, которая проверяет количество запущенных действий, и если оно ›0, оно просто закрывается, а если оно ==0, оно запускает первое действие.   -  person android developer    schedule 12.01.2013


Ответы (5)


Я узнал, как это сделать. Я добавил следующий код:

notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Теперь мой код выглядит так:

    notification = new Notification(R.drawable.icon,
            "Notify", System.currentTimeMillis());
    notification.setLatestEventInfo(this, "App name",
            "App message", PendingIntent.getActivity(this,
                    0, new Intent(this, Main.class)
                            .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                                    | Intent.FLAG_ACTIVITY_SINGLE_TOP),
                    PendingIntent.FLAG_CANCEL_CURRENT));
    notification.flags |= Notification.FLAG_ONGOING_EVENT;
person Jimix    schedule 09.03.2011
comment
Jimix, я пробовал с вашим кодом, но в моем случае это не сработало, это открывает MainActivity вместо того, чтобы сфокусироваться на последнем. Вероятно, моя ошибка в манифесте, как вы устанавливаете основную активность? - person Giuseppe; 14.05.2012
comment
Этот код должен работать. Проверьте другие действия в том же стеке задач. Они могут включать порядок задач. - person Kislingk; 13.02.2014

Мне это помогает android:launchMode="singleInstance"

<activity
        android:name="com.mosis.automatskidnevnik.MainActivity"
        android:launchMode="singleInstance"
        android:label="@string/app_name" >
        ...
person Zeljko Ivanovic    schedule 05.07.2014
comment
Избегайте использования этого и одиночной задачи, если у вас есть несколько действий, это можно использовать только для 1 действия, но вместо этого используйте флаги, если вам нужно возобновить действие или иметь некоторые условия для его запуска, проблема здесь в том, что если вам нужно больше экземпляров в будущее для отправки дополнений или данных, это помешает вам сделать это - person Gastón Saillén; 23.01.2019

Я решил ту же проблему, установив

android:launchMode="singleTask"
person Abhishek Jaiswal    schedule 26.11.2014

При создании PendingIntent вы используете:

Main.this.getBaseContext()

Вы должны использовать контекст действия по умолчанию, если хотите вернуться к тому же действию. Подробнее здесь:

Android - в чем разница между различными способы получения контекста?

person Yossi    schedule 09.03.2011
comment
Я попытался использовать контекст по умолчанию с этим в PendingIntent, но это не сработало. - person Jimix; 09.03.2011

Помимо правильного ответа @Jimix, я бы изменил значение PendingIntent requestCode с 0 на значение отличное от нуля, как прокомментировал другой ответить. С другой стороны, существует известная ошибка на предыдущих Версии Android, которые заняли у меня пару отчаянных часов. Предложенное там решение отлично сработало для меня, отменив PendingIntent перед отправкой уведомления:

if (Build.VERSION.SDK_INT == 19) {
   getNotificationPendingIntent().cancel();
}
person GoRoS    schedule 08.04.2015