Android意图接收和旋转

4
我将使用意图过滤器来获取用户点击的URL。在我的活动中,onCreate方法中有以下代码:
    Intent intent = getIntent();
    if (Intent.ACTION_VIEW.equals(intent.getAction())) {
        url = intent.getDataString();
        showDialog(DIALOG_ID);          
    }

除了当我旋转手机时,一切都很好。即使在旋转之前关闭了对话框,每次更改手机方向它都会重新打开。

我可以避免这种情况吗?

请注意,我不想锁定方向。

4个回答

5

如果您不想自己处理配置更改,另一种解决方法可能是在显示对话框之前仅检查onCreate中的savedInstanceState Bundle参数是否为null。

如果您查看onCreate的文档,您会发现当活动被重新创建(例如由于配置更改)时,savedInstanceState将是非null的,因此当活动首次运行时,它将为null。


3

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


2
这是一个相当简单的修复。在您的清单文件中,找到活动并添加以下内容:
android:configChanges="keyboardHidden|orientation"

通过在清单文件中设置android:configChanges属性,可以防止onCreate方法再次触发(我是这么认为的)。

引用自这里

在某些特殊情况下,您可能希望根据一种或多种类型的配置更改来绕过重新启动您的活动。这可以在其清单文件中使用android:configChanges属性来实现。对于您要处理的任何类型的配置更改,您都将收到当前活动的onConfigurationChanged(Configuration)方法的调用,而不是重新启动。但是,如果配置更改涉及到您不处理的任何配置更改,则仍然会重新启动该活动,并且不会调用onConfigurationChanged(Configuration)方法。


正如我在答案中指定的那样,我不想这样做。一定有更简洁的方法。 - user1026605
“cleaner” 指的是什么?Android:configChanges 是专门设计用于处理您不想重新运行 onCreate 逻辑的情况。另一种替代方法是在 onCreate 中放置一些 if else,尝试根据 onCreate 调用时的布局来排除某些代码部分的执行。顺便说一下 - 这并不会将方向冻结为仅限纵向 - 那是不同的配置,即 android:screenOrientation="portrait"。 - Bostone
有没有一种方法可以清除/消耗意图? 我试过在关闭对话框之前执行SetIntent(null),但旋转后getIntent()仍然返回接收到的意图... - user1026605
2
@user1026605 我认为你误解了Bostone的回答。这不会锁定方向。用户仍然可以旋转设备。这只是使您的Activity在旋转时不会重新创建。 - FoamyGuy
肯定有更多的方法。那可能是最简单的方法。你可能可以通过布尔标志和使用检查来实现它,以查看是否需要根据onCreate是方向更改的结果来显示对话框。 - FoamyGuy
显示剩余2条评论

0

直到今天我才第一次遇到这个问题。我使用了 getIntent().setAction(""); 并解决了它。不再有脑损伤啦 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接