当我从 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
的清单条目之后。
我的问题很容易解释:
我从推送服务创建了一个通知并开始了我的 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
的清单条目之后。