TaskStackBuilder,多个不同的PendingIntents,Notifications

时间:2015-12-23 09:23:33

标签: android android-intent notifications android-pendingintent taskstackbuilder

我对TaskStackBuilder和用于通知的不同PendingIntents的组合有问题。让我解释一下它是什么。

我有一个IntentService,可以在出现问题时创建通知。有时它会创建几个独立的通知。为什么我不合并谷歌所说的通知呢?因为每个通知应该打开相同的Activity,但是在传递的Intent中有不同的附加功能。所以这是做什么的:

使用附加功能创建新的Intent:

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中按Back按钮或Up时,我想回到父Activity。所以这就是我的工作(根据Google doc:http://developer.android.com/training/notify-user/navigation.html):

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

然后创建后台堆栈:

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ItemActivity.class);
stackBuilder.addNextIntent(notificationIntent);

和PendingIntent:

PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

Finnaly - notfication:

NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
        (...)
        .setContentIntent(notificationPendingIntent)
        (...)
mNotifyManager.notify(feed.get_id(), builder.build());

在这种情况下,app会使用正确的后台堆栈创建不同的通知,但是具有相同的PendingIntent。

当我在获取PendingIntent时替换requestCode,例如,使用feed.get_id()(或者每个PendingIntent的另一个不同的数字,如System.currentTimeMillis()),然后点击通知会为Activity带来正确的Intent(每个通知都有不同的PendingIntent) ),但没有后台堆叠 - 后退和上移按钮关闭应用程序。

我尝试删除android:launchMode =&#34; singleTask&#34;从清单中,当我创建新的Intent时,不要添加标记,读取一半的Internet,一百个StackOverflow帖子,什么都没有。

我还没有管理这两个场景的工作组合 - 即:使用正确的Intent和后台堆栈打开Activity。

提前请不要写类似&#34;只需覆盖onBackPressed并从那里开始活动&#34; - 我想知道我在这里做错了什么,以及如何用适当的工具来实现这个目标。

1 个答案:

答案 0 :(得分:2)

经过4个小时的工作,我终于找到了解决方案。只需要为待处理的意图提供不同的请求代码就非常简单。

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

getPendingIntent()方法TaskStackBuilder.getPendingIntent(int, int)

的文档