Android 如何清除启动活动的意图?

Android 如何清除启动活动的意图?,android,android-activity,android-intent,Android,Android Activity,Android Intent,在开始时,活动是通过一个意图启动的,并以此意图完成一些事情 当我更改活动的方向时,它会再次重新加载,并将意图传递给活动 我如何才能清除该意图以防止活动再次使用它 我尝试了setIntent(null),但没有结果。我的建议是使用布尔变量切换此选项,以检查是否首次创建了活动 否则,您可以查看onCreate方法,因为这仅在首次创建活动时执行。如果您的意图通过操作(使用setAction)发送到活动,则在收到意图时只需执行以下操作,以避免在屏幕旋转时多次处理此意图: Intent i = getIn

在开始时,活动是通过一个意图启动的,并以此意图完成一些事情

当我更改活动的方向时,它会再次重新加载,并将意图传递给活动

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


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

我的建议是使用布尔变量切换此选项,以检查是否首次创建了活动


否则,您可以查看onCreate方法,因为这仅在首次创建活动时执行。

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

Intent i = getIntent();
i.setAction(null);
setIntent(i);
不要使用
setIntent(null)
。看起来,虽然它有时可能会起作用,但在某些情况下,原始意图可能会回来

相反,调用
setIntent()
,使用一个没有动作、数据或额外内容的简单意图,例如
newintent(Context,Class)


实际上,最初使用
setIntent()
实际上并不是一个好的API设计决策。相反,正如dcg所指出的,请确保您仅在第一次检查您的意图时,您的
savedInstanceState
仍然为空。

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

在我的例子中,我需要将数据设置为null:

getIntent().setData(null);

旧帖子,但有些人可以用这个

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

使用“活动恢复”上的开始意图,只需添加一个额外值

putExtra("DONE", 0)
每次应用程序恢复时,请检查是否已具有此值:

hasExtra("DONE")
简单

intent.putExtra(您的键“”)//将该值重置为knknown

设定意图(intent)

即使在解析了Intent和Intent extra之后手动清除它们,Activity.getIntent()似乎总是返回启动活动的原始意图

为了解决这个问题,我建议如下:

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操作,可以使用
getIntent().setAction(“”)清除它

例如在
onCreate(…)
中:


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

在Kotlin:-

如果您想清除意图,那么这是最好的选择

intent.replaceExtras(Bundle())
intent.action = ""
intent.data = null
intent.flags = 0

同意。使用
onretainonconfigurationinstance()
将状态从旧活动传递到新活动。实际上,每当屏幕方向发生变化时(在此过程中,应用程序基本上被销毁并重新创建),onCreate()也会被调用。setIntent只是让您感到困惑——不要使用它。请参见@dcg的答案。当某个活动被销毁时,启动该活动的原始意图始终会被重新使用,无论您如何使用setIntent。原始意图完全保留在应用程序之外的ActivityManager中,setIntent对其没有影响。请看黛安娜·哈克伯恩的帖子:谢谢你对那篇帖子的引用,@JohnnyLambada!更新了答案以避免误导他人。检查
savedInstanceState==null
是否明智!!!这有助于我区分我是从启动器启动MainActivity还是从打开电子邮件附件收到的意图启动MainActivity+1 Pixel不接受明显错误的答案,而是接受@dcg。这样我就可以省下一个小时的工作。请参阅Dianne Hackborn关于setIntent如何是谎言的帖子:看看这是否有帮助-stackoverflow.com/a/19820057/313042I下面有一个类似的方法,也可以让您保留原始意图中的选择性参数。这对我在退出应用程序后从最近的应用程序列表中打开时不起作用。应用程序以空绑定打开,但与以前的意图相同。它不工作。我认为Android以不同的方式保存
Intent
,而不是保存在内存中。您仅在运行时添加此值。当活动被终止时,系统将再次检索原始的
意图
。也许可以详细说明为什么这是最好的选择。根据我的说法,这是一个很好的选择,但我也找不到其他选项。因为我想清除广播数据(在运行时),所以我使用这段代码。任何我的问题都可以解决。
intent.replaceExtras(Bundle())
intent.action = ""
intent.data = null
intent.flags = 0