Запуск приложения из Notification удаляет его из недавней истории приложений
У меня проблема в одном из моих приложений, когда я запускаю его из уведомления. Он никогда не появляется в списке "недавних приложений".
Без уведомлений все работает так, как ожидалось: я запускаю приложение, вступаю в него и когда я его покидаю (с помощью кнопки "домой" или "назад" ), после этого я могу вернуться к нему с длинным нажатием на домашнюю кнопку = > ok.
Проблема начинается, когда я получаю уведомление. Если я запускаю приложение из уведомления, он запускает правильный экран, и я могу использовать приложение = > ok. Но когда я ухожу из приложения (с помощью кнопки "домой" или "назад" ), он больше не отображается в списке "последние приложения" . Точнее:
- Если приложение появилось в списке "последние приложения" перед запуском приложения из уведомления, оно удаляет его
- Если приложение не было в списке "последние приложения" , оно не добавляет его
Ниже мой оригинальный код добавит уведомление в строку состояния:
mNotification = new Notification(R.drawable.ic_notif, message, System.currentTimeMillis());
mNotification.flags |= Notification.FLAG_AUTO_CANCEL;
Intent notificationIntent = new Intent(Intent.ACTION_VIEW,Uri.parse(link));
notificationIntent.putExtra(...);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
mNotification.setLatestEventInfo(context, context.getString(R.string.app_name), message, contentIntent);
notificationManager.notify(ConfigApp.NOTIFICATION_ID, mNotification);
Я попробовал добавить FLAG_ACTIVITY_NEW_TASK, но это не помогло:
Intent notificationIntent = new Intent(Intent.ACTION_VIEW,Uri.parse(link));
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
notificationIntent.putExtra(...);
Декларация манифеста Действия, начатая уведомлением:
<activity
android:name=".activity.ActivityMessages"
android:label=""
android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="hostapp"
android:pathPrefix="/prefixapp"
android:scheme="schemeapp" />
</intent-filter>
</activity>
Кто-нибудь знает, как сохранить приложение в списке "Недавнее приложение" после того, как он начал формировать уведомление?
Ответы
Ответ 1
Добавьте действие android.intent.action.MAIN
и категорию android.intent.category.LAUNCHER
к спецификации вашей деятельности. Наличие двух действий и категорий выглядит как хак, но фактически поддерживается Android.
<activity
android:name=".activity.ActivityMessages"
android:label=""
android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<data
android:host="hostapp"
android:pathPrefix="/prefixapp"
android:scheme="schemeapp" />
</intent-filter>
</activity>
Это должно добавить его в список последних приложений. Причина описана в документации разработчика Android:
Фильтр намерений такого типа вызывает значок и метку для активность, отображаемую в панели запуска приложений, , предоставляющая пользователям способ запуска активности и вернуться к задаче, которую она создает в любое время после его запуска.
Эта вторая способность важна: пользователи должны иметь возможность оставить задачу а затем вернуться к нему позже, используя эту программу запуска. Для этого причина, два режима запуска, которые отмечают действия как всегда инициирующие задача "singleTask" и "singleInstance" должна использоваться только тогда, когда активность имеет фильтр ACTION_MAIN и CATEGORY_LAUNCHER.Представьте, например, что может произойти, если фильтр отсутствует: намерение запускает деятельность "singleTask", инициирует новую задачу и пользователь тратит некоторое время на выполнение этой задачи. Затем пользователь нажимает кнопку "Домой". Задача теперь отправляется на задний план и не видимый. Теперь у пользователя нет возможности вернуться к задаче, потому что это не представлен в программе запуска приложений.
Ответ 2
Попробуйте добавить в манифест следующее:
android:excludeFromRecents = "false"
Удачи,
Луис
Ответ 3
Для каждой пары действий/категории вам нужно использовать отдельный Intent Filters
:
<activity
android:name=".activity.ActivityMessages"
android:label=""
android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="hostapp"
android:pathPrefix="/prefixapp"
android:scheme="schemeapp" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<data
android:host="hostapp"
android:pathPrefix="/prefixapp"
android:scheme="schemeapp" />
</intent-filter>
</activity>
Ответ 4
Я столкнулся с тем же вопросом. Проблема заключалась в том, что моя активность имела android: label = ". Когда я открываю Activity из Notification, он заменяет корневую активность в приложении на текущую. И Android исключает действия с пустой меткой из Recents (см. исходный код).
Чтобы скрыть название деятельности, вы должны использовать:
getActionBar().setDisplayShowTitleEnabled(false);
Ответ 5
Старая тема, но я обнаруживаю решение (и я не могу найти в Интернете никого), возможно, это будет полезно для sb. Он не дает возможности установить какую-либо деятельность в качестве родителя, но я думаю (не уверен), что вы можете изменить его программным способом (в OpenFromNotificationActivity), если это необходимо.
В манифесте
<activity android:name=".OpenFromNotificationActivity"
android:label="@string/label">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".StartSplashActivity" />
</activity>
<activity android:name=".StartSplashActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Ответ 6
Проверить, есть ли уведомление из
if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0)