当我从 Notification 添加 Extras 到 PendinIntent 时,RemoveExtras 没有效果

When I add Extras to PendinIntent from Notification, RemoveExtras has no effect

我的问题很容易解释:

我从推送服务创建了一个通知并开始了我的 activity 一些附加功能:

notificationIntent = new Intent(getBaseContext(), MainActivity.class);
                notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
notificationIntent.putExtra("typeI",data.get("type"));

Log.e("DEBUG","PUT EXTRA");

PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

所以,当我点击我的通知时,我可以在我的 activity 中读取类型:

Log.e("DEBUG", "Extra -> " + getIntent().getStringExtra("typeI"));

这工作正常。

唯一的烦恼是我用后退按钮退出了应用程序,Activity被破坏了,当从启动器再次启动它时,我仍然得到额外的东西!

所以,为了以防万一,我只是试图在我的 ACtivity 中删除额外内容:

Log.e("DEBUG","REMOVE");
getIntent().removeExtra("typeI");
getIntent().putExtra("typeI","");

但这并没有删除附加功能,下次我打开应用程序时附加功能仍然存在。

知道我做错了什么吗?

试试这个

getIntent().replaceExtras(new Bundle());
getIntent().setData(null);
after this add you value
getIntent().putExtra("typeI","");

当您删除 "extras" 时,这只会删除 "in-memory instance of the Intent" 中的 "extras"。原始 Intent 仍由 Android 保留,并在您再次启动应用程序时重复使用。

这是错误或功能,具体取决于您要执行的操作。

我在 2013 年对类似的问题写了一篇相当长的回复。看看我的回答 here。您可能想使用 Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS.

您也不需要使用 launchMode="singleInstance"。除非您正在编写 HOME 屏幕替换,否则不需要这种特殊的启动模式。


编辑: 您在评论中指出这对您不起作用。我认为问题在于您在 Notification 中使用了您的根 Activity(具有 ACTION=MAIN 和 CATEGORY=LAUNCHER 的那个)。试试这个:

对于Notification,不要使用MainActivity,而是NotificationActivity。将 NotificationActivity 定义为清单中 MainActivity 别名 ,如下所示:

<activity-alias
    android:name=".NotificationActivity"
    android:targetActivity=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.Launcher">
</activity>

此条目应该包含任何<intent-filter>并且必须出现MainActivity的清单条目之后。