如何清除启动Activity的Intent?

时间:2010-06-30 10:41:30

标签: android android-activity android-intent

在开始时,Intent会启动Activity,并使用此Intent完成某些操作。

当我更改Activity的方向时,会再次重新加载,并将Intent传递给Activity。

如何清除Intent以阻止Activity再次使用它?

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

10 个答案:

答案 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