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 –