从Bundle中删除条目(即extras)似乎与后退按钮组合使用

pfu*_*t75 11 android android-intent android-activity

我有一个收听传入短信的BroadcastReceiver.如果消息来自某个发件人,则BroadcastReceiver使用以下代码启动我的应用程序:

final Intent activityIntent = new Intent(context, MainActivity.class);
activityIntent.putExtra("smsChallenge", smsText);
activityIntent.putExtra("smsSenderNumber", senderMobilNumber);
activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(activityIntent);
Run Code Online (Sandbox Code Playgroud)

在我的应用程序的MainActivity中(即in onCreate()),我smsChallenge使用以下代码从intent中提取值并在提取后删除它:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    smsChallenge = extras.getString("smsChallenge");
    extras.remove("smsChallenge");
}
Run Code Online (Sandbox Code Playgroud)

所以我的应用程序从SMS启动并运行良好...但如果我选择按BACK按钮并重新启动应用程序(即通过Taskmanager),该值smsChallenge仍然在捆绑中extras.这意味着,我重新启动的应用程序认为它重新启动是因为新的短信不是真的......

当使用BACK按钮并再次重新启动应用程序时,为什么从捆绑中删除键值的任何想法似乎都不起作用?

She*_*tib 6

我认为您无法解决此问题,因为当您访问意图时,操作系统已经保存了以后通过最近的应用程序启动的意图.

  1. 您可以添加一个标记以从最近的应用中删除,但以这种方式,该应用将不会出现在最近的应用中.
  2. 在持久性存储中添加MainActivity中处理的最后一个短信,并在onCreate中执行此检查,放弃已处理的短信的意图.
  3. 最终的解决方案是不要在意图中发送数据.例如,将它们保存在"挂起"的持久存储中.当您的MainActivity启动时,让它检查待处理的内容,并清除此待处理项.

例如,持久存储可以是SharedPreferences.

我会建议你使用2,但你应该计算收到的短信并使用该计数器作为短信的id.不要依赖短信内容和发件人作为短信的标识符.


Aja*_*y S 6

因为getExtras()创建了一个意图附加的副本.

你必须这样做

getIntent().removeExtra("smsChallenge");
Run Code Online (Sandbox Code Playgroud)

文档:http://developer.android.com/reference/android/content/Intent.html#removeExtra(java.lang.String)

  • 如果你回去就行不通.一个新的意图通过原始的额外完整. (10认同)
  • 如果标记为此的人已经确认其有效,那么请提供其他详细信息,因为我无法使其工作.删除额外内容并单击后,活动将被销毁,然后从最近的应用列表中重新选择活动会产生新的意图,原始附加内容保持不变(已测试Nexus5,Nexus 10). (4认同)

gho*_*fly 1

我认为您需要为您想要的行为明确设置活动的意图。我不知道为什么getIntent()似乎要退回一份副本。

从文档中Activity.setIntent()

更改 getIntent() 返回的意图。这包含对给定意图的引用;它不会复制它。通常与 onNewIntent(Intent) 结合使用。

http://developer.android.com/reference/android/app/Activity.html#setIntent(android.content.Intent )