我有一个搜索屏幕,可以通过点击另一个屏幕的“名称”字段来启动。
如果用户遵循此工作流程,我会在Intent的Extras中添加一个名为“search”的额外内容。此额外使用填充“name”字段的文本作为其值。创建搜索屏幕时,该额外信息将用作搜索参数,并为用户自动启动搜索。
但是,由于Android会在屏幕旋转时销毁并重新创建活动,因此旋转手机会再次进行自动搜索。因此,我想在执行初始搜索时从Activity的Intent中删除“搜索”额外内容。
我试过这样做:
Bundle extras = getIntent().getExtras();
if (extras != null) {
if (extras.containsKey("search")) {
mFilter.setText(extras.getString("search"));
launchSearchThread(true);
extras.remove("search");
}
}
但是,这不起作用。如果我再次旋转屏幕,“活动的意图”附加内容中仍然存在额外的“搜索”。
有什么想法吗?
答案 0 :(得分:131)
我有它的工作。
似乎getExtras()创建了Intent附加内容的副本。
如果我使用以下行,这可以正常工作:
getIntent().removeExtra("search");
getExtras()
/**
* Retrieves a map of extended data from the intent.
*
* @return the map of all extras previously added with putExtra(),
* or null if none have been added.
*/
public Bundle getExtras() {
return (mExtras != null)
? new Bundle(mExtras)
: null;
}
答案 1 :(得分:7)
可以使用在破坏和重新创建期间持久的额外标志来解决问题。这是缩小的代码:
boolean mProcessed;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
mProcessed = (null != state) && state.getBoolean("state-processed");
processIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
mProcessed = false;
processIntent(intent);
}
@Override
protected void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putBoolean("state-processed", mProcessed);
}
protected void processIntent(Intent intent) {
// do your processing
mProcessed = true;
}
答案 2 :(得分:3)
虽然@ Andrew的回答可能提供了删除特定Intent额外内容的方法,但有时需要清除所有意图附加内容,在这种情况下,您将需要使用
Intent.replaceExtras(new Bundle())
replaceExtras
的源代码:
/**
* Completely replace the extras in the Intent with the given Bundle of
* extras.
*
* @param extras The new set of extras in the Intent, or null to erase
* all extras.
*/
public @NonNull Intent replaceExtras(@NonNull Bundle extras) {
mExtras = extras != null ? new Bundle(extras) : null;
return this;
}