Android 安卓接收和旋转

Android 安卓接收和旋转,android,rotation,screen-orientation,intentfilter,Android,Rotation,Screen Orientation,Intentfilter,我在活动中使用意图过滤器来检索用户单击的url 在activityoncreate方法中,我有以下代码 Intent intent = getIntent(); if (Intent.ACTION_VIEW.equals(intent.getAction())) { url = intent.getDataString(); showDialog(DIALOG_ID); } 它的工作非常好,除了当我旋转我的手机。即使在

我在活动中使用意图过滤器来检索用户单击的url

在activityoncreate方法中,我有以下代码

    Intent intent = getIntent();
    if (Intent.ACTION_VIEW.equals(intent.getAction())) {
        url = intent.getDataString();
        showDialog(DIALOG_ID);          
    }
它的工作非常好,除了当我旋转我的手机。即使在旋转之前关闭了该对话框,但每次我更改手机方向时它都会重新打开。 我可以保证


供您参考,我不想锁定方向

这是一个非常简单的修复方法。在清单文件中,找到活动并添加以下内容:

android:configChanges="keyboardHidden|orientation"
这将防止您在onCreate中的逻辑再次启动(或者我相信是这样)

引述:

在某些特殊情况下,您可能希望绕过重新启动 基于一种或多种类型的配置更改的活动。这是 完成了其清单中的android:configChanges属性。无论如何 您所说的在那里处理的配置更改类型,您将 接收对您当前活动的 OnConfiguration已更改(配置)方法,而不是 重新启动。如果配置更改涉及任何您不知道的内容 但是,该活动仍将重新启动并 不会调用onConfigurationChanged(配置)


另一个不需要自己处理配置更改的解决方案可能是,在显示对话框之前,只需检查onCreate中的savedInstanceState Bundle参数是否为null


如果查看onCreate的文档,您可以看到当重新创建活动时(例如由于配置更改),savedInstanceState将不为null,因此当活动重新运行时,savedInstanceState将为null。

您通常会调用
setIntent(null)
来删除用于调用活动的意图。然而,在实践中,它并不总是有效的。显然,是将意图的操作或数据或两者都设置为null,这取决于您在代码中使用的内容。在您的情况下,在显示对话框之后,我可能会使用
intent.setAction(null)

直到今天我才看到这个问题。我做了
getIntent().setAction(“”),并解决了它。不再对大脑造成损害:)

正如我在回答中所说,我不想那样做。一定有更干净的方法你说的“干净”是什么意思?Android:configChanges专门设计用于处理您不想重新运行onCreate逻辑的情况。另一种方法是将一些if-else放入onCreate中,尝试根据onCreate调用时的布局排除某些代码部分的执行。顺便说一句-这并不仅仅是将方向冻结到portret-这是不同的配置,即android:screenOrientation=“纵向”有没有办法清除/使用意图?在关闭对话框之前,我尝试执行SetIntent(null),但在旋转之后getIntent()仍然返回收到的意图…@user1026605我想你误解了Bostone的答案。这不会锁定方向。用户仍然可以旋转设备。这将使你的活动不会在旋转时被重新创造。是的,我理解你的观点。它正在工作,但我仍然想知道是否有其他方法可以避免比金在没有@Bostone解决方案的情况下两次开火的意图。