簡體   English   中英

在方向改變時調用onDestroy被調用?

[英]Getting around onDestroy being called on orientation change?

我有一個運行4.4.2的股票Nexus 5(如果重要的話使用ART),我發現了一個有趣的場景。 我有這個作為我的onDestroy()

@Override
protected void onDestroy() {
    super.onDestroy();
    t.setText("onDestroy");
    t.show();
}

這是一個面向GPS的應用程序,所以我起來走動。 我正在使用此問題中提到的技術來顯示許多調試Toast消息。

無論如何,當我旋轉我的應用程序時,會出現吐司。 我知道活動被破壞並為新方向重新創建,但我怎么知道實際發生了什么? 如何判斷我的應用程序何時被破壞而不僅僅是被輪換? 此問題類似,我想在特定活動被銷毀時注銷。

從Honeycomb開始,可以查詢isChangingConfigurations()方法以檢查是否由於配置更改而重新創建了Activity 或者,可以在任何API級別查詢isFinishing()方法,以檢查Activity是否實際完成,或者僅由系統臨時銷毀。

據我所知,這兩種方法應該總是在實踐中返回相互一致的結果。 它們可能分歧的唯一一點是系統殺死進程以清除內存,但此時沒有回調或與應用程序的交互。

onDestroy()方法的文檔提到了isFinishing()方法的用法:

在銷毀活動之前執行任何最終清理。 這可能是因為活動正在完成(有人稱為finish() ,或者因為系統暫時銷毀此活動實例以節省空間。您可以使用isFinishing()方法區分這兩種情況。

您可以將其放入設置了setRetainInstanceState(true)的片段中。 將代碼放在片段的onDestroy()方法中。 然后,在方向變化時不會破壞片段。

首先,你不應該使用onDestroy()來做任何事情,因為它不能保證被調用。 我會把東西放在onPause()方法上; 我甚至不會把東西放在onStop()上。

另外,我不確定為什么要在用戶離開應用程序時注銷用戶。 我寧願在應用程序或服務器上實現某種計時器,以便在x時間之后注銷。

現在,答案在於文檔: http//developer.android.com/reference/android/app/Activity.html#ConfigurationChanges

您可能希望覆蓋onConfigurationChanged,以便不重新啟動您的活動。

我找到了幾個解決方案,它們實際上只是在屏幕旋轉時檢測的模式。 或者,您可以通過檢查某個靜態數據成員來確定是否實際銷毀了該設備,以查看它是否已初始化。

配置更改解決方案

第一個涉及處理onConfigurationChanged回調中的所有配置更改

“請注意,只有在清單中選擇了要使用configChanges屬性處理的配置時,才會調用此選項。”

第二個涉及偵聽Display.getRotation() ,它返回一個Surface.ROTATION_ *對象。 這是屏幕相對於設備方向的自然狀態的新方向。

同樣,您可以將配置更改與靜態成員一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM