【问题标题】:TaskStackBuilder, multiple distinct PendingIntents, NotificationsTaskStackBuilder,多个不同的 PendingIntents,通知
【发布时间】:2016-03-29 16:32:18
【问题描述】:

我对 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 中按下后退按钮或向上时,我想回到父 Activity。所以这就是我所做的(根据谷歌文档: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 - 通知:

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

在这种情况下,应用会使用正确的返回堆栈创建不同的通知,但使用相同的 PendingIntent。

当我在获取 PendingIntent 时替换 requestCode,例如,feed.get_id()(或每个 PendingIntent 的另一个不同数字,如 System.currentTimeMillis())然后点击通知会带来具有适当 Intent 的 Activity(每个通知的不同 PendingIntent ),但没有返回堆栈 - Back 和 Up 按钮关闭应用程序。

我尝试从清单中删除 android:launchMode="singleTask",当我创建新 Intent 时不要添加标志,阅读一半的互联网,数百个 StackOverflow 帖子,什么都没有。

我还没有管理这两种情况的工作组合 - 即:使用适当的 Intent 和返回堆栈打开 Activity。

请不要提前写“只需覆盖 onBackPressed 并从那里开始活动”之类的东西 - 我想知道我在这里做错了什么以及如何使用适当的工具来实现这一点。

【问题讨论】:

  • TaskStackBuilder 方法应该可以工作,但是你肯定需要有唯一的请求代码,否则你不会有不同的PendingIntents 和不同的附加值。此外,您必须从清单中的两个活动声明中删除 launchMode。那肯定行不通。
  • 您可以使用adb shell dumpsys activity activities查看创建了多少任务,任务中有多少以及哪些活动等。这对于调试这些东西非常有用。
  • 总的来说,我在尝试使用TaskStackBuilder 时遇到了非常糟糕的经历。大多数开发人员都用错了,就像你在这里一样。 TaskStackBuilder 实际上应该只用于重新创建 cross-task 导航回栈。您没有跨任务导航。您只需要在同一个任务中处理 BACK/UP,您可以通过其他方式完成。

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


【解决方案1】:

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

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

getPendingIntent() 方法 TaskStackBuilder.getPendingIntent(int, int) 的文档

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多