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

时间:2012-08-31 08:36:55

标签: android android-intent android-notifications

当我从通知中启动时,我的某个应用中存在问题。它永远不会出现在“最近的应用”列表中。

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

当我收到通知时,问题就开始了。如果我从通知启动应用程序,它会启动正确的屏幕,我可以使用app =>好。但是当我退出应用程序(使用主页或后退按钮)时,它不再出现在“最近的应用程序”列表中。更确切地说:

  • 如果应用程序在通知中启动应用程序之前存在于“最近的应用程序”列表中,则将其删除
  • 如果应用程序不在“最近的应用”列表中,则不会添加

下面是我在状态栏中添加通知的原始代码:

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>

有人知道如何在通知开始后将应用保留在“最近的应用”列表中吗?

6 个答案:

答案 0 :(得分:8)

将操作android.intent.action.MAIN和类别android.intent.category.LAUNCHER添加到您的活动规范中。有两个动作和类别似乎是一个黑客,但它是actually supported by 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 developer documentation

中描述
  

此类意图过滤器会导致图标和标签   要在应用程序启动器中显示的活动,为用户提供   启动活动并返回其创建的任务的方法   它发布后的任何时候。

     

第二种能力很重要:用户必须能够完成任务   然后使用此活动启动器返回到它。 为此   原因是,两种启动模式将活动标记为始终启动   任务,“singleTask”和“”singleInstance“,只应在使用时使用   该活动有一个ACTION_MAIN和一个CATEGORY_LAUNCHER过滤器。   想象一下,例如,如果过滤器丢失会发生什么:An   intent启动“singleTask”活动,启动新任务,以及   用户花费一些时间在该任务中工作。然后用户按下   主页按钮。任务现在发送到后台,而不是   可见。现在用户无法返回任务,因为它是   没有在应用程序启动器中表示。

答案 1 :(得分:0)

尝试向清单添加以下内容:

android:excludeFromRecents = "false"
祝你好运, 路易斯

答案 2 :(得分:0)

您需要为每个操作/类别对使用单独的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>

答案 3 :(得分:0)

我碰到了同样的问题。问题是我的活动有 android:label =“”。当我从Notification中打开Activity时,它会将app任务中的root活动替换为当前的活动。并且Android排除了来自最近的空标签活动(参见source code)。

要隐藏您应该使用的活动标题:

getActionBar().setDisplayShowTitleEnabled(false);

答案 4 :(得分:0)

旧主题,但我发现了解决方案(我无法在网络中找到任何人),也许这对某人有帮助。它没有提供将任何活动设置为父级的可能性,但我认为(不确定)您可以在必要时以编程方式(在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>

答案 5 :(得分:0)

检查是否来自通知

if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0)