17

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

没有通知,一切都按预期工作:我启动应用程序,导航到当我退出它(使用主页按钮或返回按钮)之后,我可以通过长按主页按钮返回它=> 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 的清单声明:

<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>

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

4

5 回答 5

8

将动作android.intent.action.MAIN和类别添加android.intent.category.LAUNCHER到您的活动规范中。拥有两个动作和类别看起来像是一个 hack,但它实际上是由 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 开发者文档中有描述:

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

第二个能力很重要:用户必须能够离开任务,然后稍后使用此活动启动器返回任务。出于这个原因,只有当 Activity 具有 ACTION_MAIN 和 CATEGORY_LAUNCHER 过滤器时,才应该使用将活动标记为始终启动任务的两种启动模式“singleTask”和“singleInstance”。 想象一下,例如,如果会发生什么情况缺少过滤器:意图启动“singleTask”活动,启动新任务,用户在该任务上花费一些时间。然后用户按下主页按钮。任务现在被发送到后台并且不可见. 现在用户没有办法返回任务,因为它没有在应用程序启动器中表示。

于 2012-09-15T19:05:34.850 回答
0

我遇到了同样的问题。问题是我的活动有android:label=""。当我从通知中打开活动时,它将应用程序任务中的根活动替换为当前活动。Android 会从“最近”中排除带有空标签的活动(参见源代码)。

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

getActionBar().setDisplayShowTitleEnabled(false);
于 2014-10-15T18:47:11.307 回答
0

尝试将以下内容添加到清单中:

android:excludeFromRecents = "false"

祝你好运,路易斯

于 2012-09-18T15:45:22.120 回答
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>
于 2012-09-18T20:38:50.803 回答
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>
于 2015-02-25T12:17:30.127 回答