Запуск приложения из Notification удаляет его из недавней истории приложений - программирование

Запуск приложения из 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>

Кто-нибудь знает, как сохранить приложение в списке "Недавнее приложение" после того, как он начал формировать уведомление?

4b9b3361

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