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

Android 跨 Activity 控制 UI:全局狀態管理模式替代直接引用

     編輯:程式設計疑難解答

錯誤嘗試

在 Activity A 持有 Activity B 的引用,或通過廣播直接操作 B 的 View:

  • 內存洩漏風險極高(Activity 不能被 GC 回收)。
  • B 可能已銷毀/重建,引用失效導致 Crash。
  • 廣播接收時機不可控,UI 狀態不同步。

正確模式:Application/單例持有「狀態」而非「View 引用」

1. 定義全局狀態類


public class UiStateManager {
    private static UiStateManager instance = new UiStateManager();
    public static UiStateManager get() { return instance; }

    private boolean hideButtons = false;
    private long hideUntilTimestamp = 0;

    public synchronized void requestHideButtons(long durationMs) {
        hideButtons = true;
        hideUntilTimestamp = System.currentTimeMillis() + durationMs;
    }

    public synchronized boolean shouldHideButtons() {
        if (hideButtons && System.currentTimeMillis() < hideUntilTimestamp) return true;
        hideButtons = false; // 過期自動重置
        return false;
    }
}

2. Activity B 在 onResume/onWindowFocusChanged 讀取狀態


@Override
protected void onResume() {
    super.onResume();
    updateButtonVisibility();
}

private void updateButtonVisibility() {
    boolean hide = UiStateManager.get().shouldHideButtons();
    btnAction.setVisibility(hide ? View.GONE : View.VISIBLE);
}

3. Activity A 觸發隱藏


UiStateManager.get().requestHideButtons(10_000); // 10 秒後自動恢復

進階:LiveData + ViewModel (架構組件)


// SharedViewModel (Scoped to Activity 或 Application)
public class SharedViewModel extends ViewModel {
    private MutableLiveData hideButtons = new MutableLiveData<>(false);
    public LiveData getHideButtons() { return hideButtons; }
    public void setHideButtons(boolean hide) { hideButtons.postValue(hide); }
}

// Activity A
viewModel.setHideButtons(true);

// Activity B
viewModel.getHideButtons().observe(this, hide -> btn.setVisibility(hide ? GONE : VISIBLE));

總結

跨 Activity 傳遞「不變數據/狀態」,而非「可變 View 引用」。 用單例狀態管理器或 SharedViewModel,生命周期安全、代碼解耦、易測試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved