首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 防止螢幕旋轉重建 Activity 的正確設定

     編輯:程式設計綜合問答

螢幕旋轉預設會銷毀並重建 Activity(觸發 onDestroy → onCreate),導致 AsyncTask、執行緒、對話框等狀態遺失。若需鎖定直向/橫向或自行處理旋轉,可透過 Manifest 設定或程式碼控制。

方案一:Manifest 鎖定方向(最簡單)


<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait" > <!-- 或 "landscape", "sensor", "user" -->
</activity>

優點:零代碼、系統自動處理。
缺點:使用者無法旋轉、平板/折疊機體驗差、無法適應多視窗。

方案二:自行處理配置變更(保留實例)


<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden" >
</activity>

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // 手動處理:切換佈局、調整視圖、更新資源
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // 橫向邏輯
    } else {
        // 直向邏輯
    }
}

注意:API 13+ 必須包含 screenSize,否則旋轉仍會重建。

方案三:ViewModel + onSaveInstanceState(現代最佳實踐)

不阻止重建,而是妥善保存/恢復狀態:


// ViewModel 自動存活於配置變更
public class MyViewModel extends ViewModel {
    private MutableLiveData<List<Item>> items = new MutableLiveData<>();
    // 資料保持不變
}

// Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    viewModel = new ViewModelProvider(this).get(MyViewModel.class);
    // 觀察資料...
}

配合 onSaveInstanceState 保存 UI 狀態(捲動位置、輸入內容):


@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("scrollPos", recyclerView.getScrollY());
    outState.putString("inputText", editText.getText().toString());
}

@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    editText.setText(savedInstanceState.getString("inputText"));
    recyclerView.post(() -> recyclerView.scrollTo(0, savedInstanceState.getInt("scrollPos")));
}

方案比較與選擇指南

方案適用場景優點缺點
鎖定方向遊戲、相機、全螢幕沉浸式簡單、效能好體驗死板、不適應新裝置
configChanges影片播放器、地圖導航、複雜 Canvas 繪圖保留實例、無重建開銷需手動處理所有資源切換、易漏
ViewModel + 狀態保存絕大多數一般應用架構清晰、自動生命週期、支援進程死後恢復重建有微小開銷

AsyncTask 特別說明

AsyncTask 已棄用(API 30),旋轉時易洩漏 Context。請遷移至 Coroutine、RxJava 或 ExecutorService,並搭配 ViewModel 管理生命週期。

現代 Android 開發推薦「擁抱重建、妥善保存狀態」,而非強行阻止旋轉,能獲得更佳的裝置適應性與使用者體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved