我想问一下是否可能出现以下行为,如果是,我该如何实现。我出于某种特定原因需要这种行为。
我有两个活动,我将其称为活动A和活动B.现在让我们看一下这个例子:
从活动A,纵向,我启动活动B(具有固定的横向方向)。用户,当活动B以横向显示时,显然会旋转设备。活动B结束,活动A恢复。用户将设备保持横向方向,以便在恢复后立即更改活动A的方向。
我想要的是避免当用户返回时活动A的方向发生变化。我希望在最后一个方向上恢复活动A,并且只允许在此之后更改方向。
锁定方向不是一个选项,因为我希望允许用户随时更改它。
android:configChanges =“orientation | screenSize”解决方案既不是一个选项,因为我希望在方向更改后重新创建我的活动。
我可以选择实现我想要的吗?
谢谢!
编辑:我忘了说在活动A被销毁之前保存当前方向并在再次创建它时恢复它也不是一个选项。活动B结束后不应重新创建活动A.
编辑2:我现在在想,我意识到我可以从另一个角度改写这个问题。
我希望避免在活动B结束后恢复活动A时重新创建活动A.
Afaik,当设备方向发生变化时,会向ActivityThread发送一条消息(值为RELAUNCH_ACTIVITY)。这会导致使用新的屏幕方向重新创建活动A.
我想避免重新启动活动,因为这会解决我的问题,并会保留最后的方向。
答案 0 :(得分:2)
我认为不可能像你所描述的那样这样做。当用户从横向活动返回到您之前的活动时,您需要将方向锁定为纵向(以便忽略手机现在所处的横向方向)。现在,如果用户旋转手机,您将看不到旋转,您将无法更改方向。由于您无法确定用户是刚刚旋转手机还是旋转是由于仅从横向活动返回,因此您无法区分这两个条件。
但是,假设您可以某种方式区分这两种情况,请尝试以下方法:
如果您不希望Android在方向更改时重新创建您的活动(即使仅在某些情况下),那么您需要告诉Android您希望通过设置
来自行处理方向更改android:configChanges="orientation|screenSize"
清单中的。
现在,您需要实现onConfigurationChanged()
来获取所需的行为。如果您的活动已启动另一个具有固定方向的活动,您将需要在启动该活动之前保存当前屏幕方向。当用户返回您的活动时,Android不会销毁它并创建一个新实例,它只会调用onConfigurationChanged()
。当您收到onConfigurationChanged()
电话时,您需要检查用户是否刚刚旋转了设备,或者这是否是从方向锁定活动返回的结果。如果这是启动另一个活动后的返回,则可以通过调用setRequestedOrientation()
将屏幕方向锁定到上一个方向。在用户刚刚旋转手机的情况下,您可以:
Activity.recreate()
重新创建活动注意:这仅适用于在11级或更高级别的API上运行setContentView()
)并重置您的成员变量,就像重新创建活动一样startActivity(new Intent(this, this.class)
然后调用finish()
以删除当前实例。答案 1 :(得分:0)
您可能会将您的活动的当前方向存储在onStop()的共享首选项中,并将其恢复为onResume()