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按钮并再次重新启动应用程序时,为什么从捆绑中删除键值的任何想法似乎都不起作用?
我认为您无法解决此问题,因为当您访问意图时,操作系统已经保存了以后通过最近的应用程序启动的意图.
例如,持久存储可以是SharedPreferences.
我会建议你使用2,但你应该计算收到的短信并使用该计数器作为短信的id.不要依赖短信内容和发件人作为短信的标识符.
因为getExtras()创建了一个意图附加的副本.
你必须这样做
getIntent().removeExtra("smsChallenge");
Run Code Online (Sandbox Code Playgroud)
文档:http://developer.android.com/reference/android/content/Intent.html#removeExtra(java.lang.String)
我认为您需要为您想要的行为明确设置活动的意图。我不知道为什么getIntent()似乎要退回一份副本。
从文档中Activity.setIntent()
更改 getIntent() 返回的意图。这包含对给定意图的引用;它不会复制它。通常与 onNewIntent(Intent) 结合使用。
http://developer.android.com/reference/android/app/Activity.html#setIntent(android.content.Intent )