从传入的意图中删除额外内容
我有一个search屏幕,可以通过点击另一个屏幕的“名称”字段来启动。
如果用户遵循这个工作stream程,我会在Intent的Extras中添加一个名为“search”的附加内容。 这额外使用填充“名称”字段作为其值的文本。 在创buildsearch屏幕时,将使用该额外的search参数,并自动为用户启动search。
但是,由于Android会在屏幕旋转时破坏并重新创build活动,因此旋转手机会再次进行自动search。 因此,我想在执行初始search时从Activity的Intent中删除额外的“search”。
我试过这样做:
Bundle extras = getIntent().getExtras(); if (extras != null) { if (extras.containsKey("search")) { mFilter.setText(extras.getString("search")); launchSearchThread(true); extras.remove("search"); } }
但是,这是行不通的。 如果我再次旋转屏幕,“search”额外仍然存在于活动的意图的附加。
有任何想法吗?
我有它的工作。
看来getExtras() 创build了 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; }
问题可以通过额外的标志来解决,这个标志在破坏和娱乐过程中是持久的。 这里是缩小的代码:
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; }