Android TaskStackBuilder、多个不同的挂起内容、通知

Android TaskStackBuilder、多个不同的挂起内容、通知,android,android-intent,notifications,android-pendingintent,taskstackbuilder,Android,Android Intent,Notifications,Android Pendingintent,Taskstackbuilder,我对TaskStackBuilder和用于通知的不同挂起内容的组合存在问题。让我解释一下是关于什么的 我有一个IntentService,它在出现问题时创建通知。有时它会创建几个独立的通知。为什么我不像谷歌说的那样合并通知?因为每个通知都应该打开相同的活动,但在传递的意图中有不同的附加内容。因此,以下是一个公司应该做的: 使用附加功能创建新的意图: Intent notificationIntent = new Intent(this, ItemActivity.class); notifica

我对TaskStackBuilder和用于通知的不同挂起内容的组合存在问题。让我解释一下是关于什么的

我有一个IntentService,它在出现问题时创建通知。有时它会创建几个独立的通知。为什么我不像谷歌说的那样合并通知?因为每个通知都应该打开相同的活动,但在传递的意图中有不同的附加内容。因此,以下是一个公司应该做的:

使用附加功能创建新的意图:

Intent notificationIntent = new Intent(this, ItemActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

notificationIntent.putExtra(ItemActivity.URL_KEY, feed.getUrl());
notificationIntent.putExtra(ItemActivity.FEED_ID, feed.get_id());
notificationIntent.putExtra(ItemActivity.TITLE, feed.getTitle());
现在是棘手的部分-我想用适当的后堆栈打开ItemActivity,这意味着当我按下后退按钮或AppBar中的Up时,我想回到父活动。下面是我所做的(根据谷歌文档:):

在AndroidManifest.xml中,我有:

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".ItemActivity"
        android:label="@string/item_activity"
        android:launchMode="singleTask"
        android:parentActivityName=".MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>
和悬挂式:

PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
最终-通知:

NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
        (...)
        .setContentIntent(notificationPendingIntent)
        (...)
mNotifyManager.notify(feed.get_id(), builder.build());
在这种情况下,应用程序使用适当的后堆栈创建不同的通知,但使用相同的PendingEvent

当我在获取PendingEvent时用feed.get_id(),但是如果没有back stack,back和Up按钮将关闭应用程序

我试过从清单中删除android:launchMode=“singleTask”,在创建新意图时不添加标志,阅读了一半的互联网内容,数百篇StackOverflow文章,什么都没有

我还没有管理好这两种场景的工作组合——即:具有适当意图的打开活动和后台堆栈


请事先不要写类似“只需重写onBackPressed并从那里开始活动”的内容-我想知道我在这里做错了什么,以及如何使用适当的工具来实现这一点。

经过4个小时的工作,我终于找到了解决方案。这很简单,只是您需要为挂起的意图提供不同的请求代码

PendingIntent pendingIntent = stackBuilder.getPendingIntent((int) gcmMessage.getId() /*Unique request code for each PendingIntent*/, PendingIntent.FLAG_UPDATE_CURRENT);

getPendingEvent()
method

的文档
TaskStackBuilder
方法应该可以工作,但是您肯定需要有唯一的请求代码,否则您将不会有不同的
PendingEvent
和不同的额外内容。此外,还必须从清单中的两个活动声明中删除
启动模式
。这肯定行不通。你可以使用
adb shell dumpsys activity activities
查看创建了多少任务,任务中有多少任务以及哪些活动等。这是调试这些东西的一个非常有用的工具。一般来说,我在尝试使用
TaskStackBuilder
时有过非常糟糕的经验。大多数开发人员都在错误地使用它,就像您在这里一样
TaskStackBuilder
实际上只应用于重新创建跨任务导航backbackback。您没有跨任务导航。您只需要在同一任务中处理备份/备份,这可以通过其他方式完成。
PendingIntent pendingIntent = stackBuilder.getPendingIntent((int) gcmMessage.getId() /*Unique request code for each PendingIntent*/, PendingIntent.FLAG_UPDATE_CURRENT);