2

我想问问下面的行为是否可行,如果是,我该如何实现它。我需要这种行为的一个非常具体的原因。以与暂停时相同的方向恢复活动?

我有两个活动,我会打电话给他们的活动A和活动B.现在让我们来看看下面这个例子:

从活动A,在纵向,我启动活动B(其中有一个固定的横向) 。用户作为活动B在横向上显示,明显地旋转设备。活动B结束并且活动A被恢复。用户将设备保持横向方向,以便活动A的方向在刚恢复之后立即改变。

我想要的是避免活动A的方向在用户返回时改变。我想在最后一个方向恢复活动A,并且之后只允许方向更改。

锁定方向不是一个选项,因为我想允许用户随时更改它。

android:configChanges =“orientation | screenSize”解决方案既不是一个选项,因为我希望我的活动在方向更改后重新创建。

我有一个选项可以实现我想要的吗?

谢谢!

编辑:我忘了说,保存当前方位破坏活动之前和恢复它再次创建时是不是一种选择了。活动B完成后不应重新创建活动A.

编辑2:我现在在想,我意识到我可以从另一个角度重写问题。

我想避免在活动B完成后重新开始活动A的重新创建。

Afaik,当设备方向发生变化时,会向ActivityThread发送一条消息(值为RELAUNCH_ACTIVITY)。这导致活动A以新的屏幕方向重新创建。

我想避免活动重新启动,因为这将解决我的问题,并将保持最后的方向。

+0

当您的活动重新创建时,您无法控制。您可能应该将您的活动状态定义为不同的类,并将其存储/恢复到onSaveInstanceState/onCreate http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os。捆绑) 该州可以包括最后的方向 –

+0

这就是我在其他情况下做的,但我不能在这个特定情况下。我需要保留当前活动A的实例。 –

+0

你不能那样做。 Android可以随时杀死您的活动。你可以将不想被杀死的东西移动到服务中,但Android也可以杀死一个服务。 –

回答

2

我不认为这是可能的,你所描述来做到这一点。当用户从横向活动返回到先前的活动时,您需要将方向锁定为纵向(以便忽略手机现在所处的横向方向)。现在,如果用户旋转手机,您将看不到旋转,您将无法更改方向。由于您无法确切知道用​​户是否只是旋转了手机,或者如果旋转是由于仅从横向模式中返回,您无法区分这两种情况。

但是,假设你能以某种方式这两个病例之间差异,请尝试以下操作:

如果你不希望Android重新创建上改变方向时(即使只在某些情况下)活动,那么你将需要告诉Android,您希望通过设置

android:configChanges="orientation|screenSize" 

自己处理清单中的方向更改。

现在您需要实施才能获得您想要的行为。在您的活动启动了固定方向的其他活动的情况下,您需要在启动该活动之前保存当前的屏幕方向。当用户返回到您的活动时,Android不会销毁它并创建一个新实例,它只会调用。当您拨打电话时,您需要检查用户是否只是旋转了设备,或者这是否是从方位锁定活动返回的结果。如果这是启动另一活动后的返回,则可以通过调用setRequestedOrientation()将屏幕方向锁定到先前的方向。在用户只需旋转手机的情况下,然后,您可以:

  • 通过调用Activity.recreate()注重新创建活动:这仅适用如果您在API级别运行11或更高
  • 通过重新创建活动调用自己的方法,它基本上没有必要重新创建视图的一切(呼叫setContentView())和重置您的成员变量如果活动被重新
  • 重新创建活动再次启动你的活动:startActivity(new Intent(this, this.class),然后调用finish()摆脱的当前实例。
+1

看起来这是最好的解决方案,并且很好的了解所有这些方法来实现我想要的。谢谢您的回答! –

0

你,也许可以您的活动目前的定向保存在的onStop()共享偏好,并在恢复的onResume()

+0

这是一个很好的解决方案,但我忘了说我想保留上次使用的方向而不重新创建活动。不管怎么说,还是要谢谢你! –

+0

然后在onResume –