从通知启动应用程序会将其从最近的应用历史记录中删除

ol_*_*_er 17 android android-intent android-notifications

当我从通知中启动它时,我的某个应用程序出现问题.它从未出现在"最近的应用"列表中.

没有通知,每件事都按预期工作:我启动应用程序,导航进入,当我退出它时(使用主页按钮或后退按钮)之后,我可以通过长按主页按钮=>确定返回到它.

当我收到通知时,问题就开始了.如果我从通知启动应用程序,它会启动正确的屏幕,我可以使用app => 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);
Run Code Online (Sandbox Code Playgroud)

我尝试添加FLAG_ACTIVITY_NEW_TASK但它没有帮助:

Intent notificationIntent = new Intent(Intent.ACTION_VIEW,Uri.parse(link));
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
notificationIntent.putExtra(...);
Run Code Online (Sandbox Code Playgroud)

通知启动的活动的清单声明:

<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>
Run Code Online (Sandbox Code Playgroud)

有人知道如何在通知启动后将应用程序保留在"最近的应用程序"列表中吗?

Nic*_*las 8

将操作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>
Run Code Online (Sandbox Code Playgroud)

这应该将它添加到最近的应用程序列表中.原因在Android开发人员文档中描述:

这种意图过滤器会导致活动的图标和标签显示在应用程序启动器中,从而为用户提供启动活动并在启动后随时返回创建的任务的方法.

第二种能力很重要:用户必须能够离开任务,然后使用此活动启动器返回该任务.因此,仅当活动具有ACTION_MAIN和CATEGORY_LAUNCHER过滤器时,才应使用将活动标记为始终启动任务的两种启动模式"singleTask"和"singleInstance". 例如,想象一下,如果会发生什么,如果过滤器丢失:一个intent启动"singleTask"活动,启动一个新任务,用户花一些时间在该任务中工作.然后用户按下Home按钮.任务现在被发送到后台并且不可见现在用户无法返回任务,因为它没有在应用程序启动器中表示.