在开始时,Intent会启动Activity,并使用此Intent完成某些操作。
当我更改Activity的方向时,会再次重新加载,并将Intent传递给Activity。
如何清除Intent以阻止Activity再次使用它?
我尝试了setIntent(null)
,但没有结果。
答案 0 :(得分:23)
我有类似的问题。这对我有帮助。 也许您还必须使用onSaveInstanceState(Bundle outState)并向bundle添加额外数据,因此inState不为null,不确定。
Intent activityIntent = null; // Subsequent times it's null
@Override
protected void onCreate(Bundle inState) {
super.onCreate(inState);
.
.
if (inState!=null) {
/*Recreating activity with a saved state*/
} else {
/*Creating activity*/
activityIntent = getIntent(); // First time through intent is used
/*Get your Extra Intent data here. You will be capturing data on 1st creation. */
}
答案 1 :(得分:10)
请勿使用setIntent(null)
。似乎虽然它有时可能会起作用,但在某些情况下,原始意图可能会回来。
而是使用没有动作,数据或附加内容的简单意图调用 setIntent()
,例如new Intent(Context, Class)
。
事实上,setIntent()
的使用实际上并不是一个好的API设计决策。相反,正如dcg所指出的那样,请确保在savedInstanceState
仍然为空时第一次检查您的意图。
答案 2 :(得分:2)
如果您的意图通过动作(使用setAction)发送到您的活动,请在收到意图时执行以下操作,以避免在屏幕旋转时多次处理此意图:
Intent i = getIntent();
i.setAction(null);
setIntent(i);
答案 3 :(得分:1)
旧帖子,但有些人可以使用它。
不要浪费时间,如果您的应用程序恢复,意图将再次出现。
使用“活动恢复”的起始意图,只需添加一个额外的值
putExtra("DONE", 0)
每次您的应用恢复时,请检查是否已有此值:
hasExtra("DONE")
易
答案 4 :(得分:1)
如果您设置了意图操作,则可以使用getIntent().setAction("");
例如onCreate(...)
:
...
String action = getIntent().getAction();
if (action != null) {
if (action.equals(YOUR_ACTION_WHATEVER)) {
doSomethingHere(); // do something here
getIntent().setAction(""); // clear the action
}
}
...
这将清除操作,否则每次旋转设备时都会调用它。
答案 5 :(得分:0)
我的建议是用布尔变量切换它,以检查你的活动是否首次创建。
否则,您可以查看onCreate方法,仅在首次创建活动时执行此方法。
答案 6 :(得分:0)
在我的情况下,我需要将数据设置为null:
getIntent().setData(null);
答案 7 :(得分:0)
intent.putExtra(YourKey,""); //reset the value to knknown
setIntent(intent);
答案 8 :(得分:0)
即使在解析了Intent和Intent extras之后,似乎Activity.getIntent()总是会返回启动Activity的原始Intent。
为了解决这个问题,我建议这样:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The Intent provided by getIntent() (and its extras) will persist through a restore
// via savedInstance. Because of this, restoring this activity from a
// an instance that was originally started with extras (deep-link or
// pre-defined destination) may cause un-desired behavior
// (ie...infinite loop of sending the user directly to somewhere else because of a
// pre-defined alternate destination in the Intent's extras).
//
// To get around this, if restoring from savedInstanceState, we explicitly
// set a new Intent *** to override the original Intent that started the activity.***
// Note...it is still possible to re-use the original Intent values...simply
// set them in the savedInstanceState Bundle in onSavedInstanceState.
if (savedInstanceState != null) {
// Place savedInstanceState Bundle as the Intent "extras"
setIntent(new Intent().putExtras(savedInstanceState));
}
processIntent(getIntent())
}
private void processIntent(Intent intent) {
if (getIntent().getExtras() == null) {
// Protection condition
return;
}
doSomething(intent.getExtras.getString("SOMETHING_I_REALLY_NEED_TO_PERSIST"));
final String somethingIDontWantToPersist =
intent.getExtras.getString("SOMETHING_I_DONT_WANT_TO_PERSIST");
if(somethingIDontWantToPersist != null) {
doSomething(somethingIDontWantToPersist);
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save selective extras from original Intent...
savedInstanceState.putString("SOMETHING_I_REALLY_NEED_TO_PERSIST", "persistedValued");
super.onSaveInstanceState(savedInstanceState);
}
这样,有一种机制可以转储原始Intent,同时仍保留显式保留原始Intent / Intent附加内容的某些部分的功能。
请注意,我尚未测试所有活动启动模式。
答案 9 :(得分:0)
在 Kotlin 中:-
如果您想明确意图,那么这是最好的选择。
intent.replaceExtras(Bundle())
intent.action = ""
intent.data = null
intent.flags = 0