我遇到了TaskStackBuilder和不同PendingIntent的组合问题,用于通知。让我解释一下是什么意思。
我有一个IntentService,当有新内容时会创建通知。有时它会创建几个独立的通知。为什么我不像Google建议的那样合并通知呢?因为每个通知都应该打开相同的Activity,但传递的Intent中的extras不同。所以我做了以下操作:
创建带有extras的新Intent:
现在是棘手的部分 - 我想以适当的后退堆栈打开ItemActivity,这意味着当我按下“返回”按钮或AppBar中的“向上”按钮时,我希望返回到父Activity。所以这里是我所做的(根据Google文档:http://developer.android.com/training/notify-user/navigation.html):
在AndroidManifest.xml中我有:
然后创建返回堆栈:
在这种情况下,应用程序使用相同的PendingIntent创建不同的通知,但是具有适当的后退堆栈。
当我用feed.get_id()(或另一个每个PendingIntent的不同数字,例如System.currentTimeMillis())替换获取PendingIntent时的requestCode时,点击通知会带来具有适当Intent的Activity(每个通知的不同PendingIntent),但是没有后退堆栈 - 返回和上方按钮关闭应用程序。
我尝试从清单中删除android:launchMode =“singleTask”,在创建新Intent时不添加标志,阅读了一半的互联网,数百个StackOverflow帖子,但什么都没找到。
我还没有成功地将这两种情况结合起来 - 即:打开具有适当Intent和后退堆栈的Activity。
请提前不要写类似“只需覆盖onBackPressed并从那里启动活动”的内容 - 我想知道我在这里做错了什么以及如何使用适当的工具实现这一点。
我有一个IntentService,当有新内容时会创建通知。有时它会创建几个独立的通知。为什么我不像Google建议的那样合并通知呢?因为每个通知都应该打开相同的Activity,但传递的Intent中的extras不同。所以我做了以下操作:
创建带有extras的新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。所以这里是我所做的(根据Google文档: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);
最后 - 通知:
NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
(...)
.setContentIntent(notificationPendingIntent)
(...)
mNotifyManager.notify(feed.get_id(), builder.build());
在这种情况下,应用程序使用相同的PendingIntent创建不同的通知,但是具有适当的后退堆栈。
当我用feed.get_id()(或另一个每个PendingIntent的不同数字,例如System.currentTimeMillis())替换获取PendingIntent时的requestCode时,点击通知会带来具有适当Intent的Activity(每个通知的不同PendingIntent),但是没有后退堆栈 - 返回和上方按钮关闭应用程序。
我尝试从清单中删除android:launchMode =“singleTask”,在创建新Intent时不添加标志,阅读了一半的互联网,数百个StackOverflow帖子,但什么都没找到。
我还没有成功地将这两种情况结合起来 - 即:打开具有适当Intent和后退堆栈的Activity。
请提前不要写类似“只需覆盖onBackPressed并从那里启动活动”的内容 - 我想知道我在这里做错了什么以及如何使用适当的工具实现这一点。
TaskStackBuilder
方法应该可以工作,但是你一定需要有唯一的请求代码,否则你将无法获得具有不同额外信息的不同PendingIntent
。此外,你必须从清单文件中的两个活动声明中删除launchMode
。那肯定行不通。 - David Wasseradb shell dumpsys activity activities
来查看已创建了多少个任务,有哪些活动在任务中,等等。这是一个非常有用的工具来调试这些问题。 - David WasserTaskStackBuilder
尝试过的经验都很糟糕。大多数开发人员都使用错误的方式,就像你在这里一样。TaskStackBuilder
应该只用于重新创建跨任务导航回退栈。你没有跨任务导航。你只需要处理同一个任务中的BACK/UP,这可以用其他方法完成。 - David Wasser