如何清除启动Activity的意图?

开始时Activity是由Intent启动的,并且用这个Intent完成一些事情。

当我改变Activity的方向时,它又被重新加载,Intent被传递给Activity。

如何清除该意图以防止活动再次使用它?

我试过setIntent(null) ,但没有结果。

Related of "如何清除启动Activity的意图?"

我有类似的问题。 这帮助了我。 也许你还必须使用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. */ } 

不要使用setIntent(null) 。 似乎虽然有时可能有效,但在某些情况下,原意可能会回来。

相反,调用setIntent()的一个简单的意图,没有一个行动,数据或额外,如new Intent(Context, Class)

事实上,使用setIntent()实际上并不是一个好的APIdevise决策。 相反,正如dcg指出的那样,当你的savedInstanceState仍然为空时,确保你只是第一次检查你的意图。

旧的post,但有人可以使用这个。

不要浪费时间,如果你的应用程序被恢复,意图将再次存在。

使用“活动简历”的开始意图,只是添加一个额外的价值

 putExtra("DONE", 0) 

每次你的应用程序恢复时,检查是否已经有这个值:

 hasExtra("DONE") 

简单

如果您的意图通过一个动作(使用setAction)发送给您的活动,只需在收到意图时执行以下操作,以避免在屏幕旋转时多次处理此意图:

 Intent i = getIntent(); i.setAction(null); setIntent(i); 

我的build议是切换这个布尔variables来检查你的活动是否第一次创build或不。

否则,你可以看看你的onCreate方法,afaik只在第一次创build活动时执行。

在我的情况下,我需要将数据设置为null:

 getIntent().setData(null); 

intent.putExtra(YourKey,""); //reset the value to knknown setIntent(intent);

即使在parsing后手动清除了Intent和Intent附加项之后,似乎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附加组件某些部分的能力。

请注意,我没有testing过所有的Activity启动模式。

如果你设置了intent动作,你可以使用getIntent().setAction("");来清除它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 } } ... 

这将清除该操作,否则每次旋转设备时都会调用该操作。