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

Android TabActivity 中 Tab 切換導致 Intent 數據丟失的正確處理模式

     編輯:程式設計綜合問答

問題現象

TabActivity 包含兩個 Tab,每個 Tab 關聯一個 Activity。切換 Tab 時,目標 Activity 的 onResume() 早於 Tab 切換監聽器執行,導致通過 Intent.putExtra() 傳遞的標識(如 isTrendingTab)無法被正確接收。

根本原因

TabHost 內部機制:Tab 內容 Activity 在首次創建後會被保持,切換 Tab 只是顯示/隱藏,不會重新啟動 Activity。因此 onCreate()、onNewIntent() 不會再次調用,getIntent() 返回的是首次啟動時的 Intent。

正確模式:本地廣播或共享 ViewModel

方案一:LocalBroadcastManager(解耦通信)

// TabActivity 切換監聽器中發送
tabHost.setOnTabChangedListener(tabId -> {
    Intent intent = new Intent("TAB_SWITCHED");
    intent.putExtra("isTrending", tabId.equals("trending"));
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
});

// 子 Activity 註冊接收
private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        boolean isTrending = intent.getBooleanExtra("isTrending", false);
        updateUI(isTrending);
    }
};

@Override
protected void onResume() {
    super.onResume();
    LocalBroadcastManager.getInstance(this).registerReceiver(receiver,
        new IntentFilter("TAB_SWITCHED"));
}

@Override
protected void onPause() {
    super.onPause();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
}

方案二:共享 ViewModel(現代架構推薦)

// 共享 ViewModel(需 lifecycle-extensions)
public class TabSharedViewModel extends ViewModel {
    private MutableLiveData isTrendingTab = new MutableLiveData<>();
    public void setTrendingTab(boolean value) { isTrendingTab.setValue(value); }
    public LiveData getTrendingTab() { return isTrendingTab; }
}

// TabActivity 設置
TabSharedViewModel vm = new ViewModelProvider(this).get(TabSharedViewModel.class);
tabHost.setOnTabChangedListener(tabId -> 
    vm.setTrendingTab(tabId.equals("trending")));

// 子 Activity 觀察
TabSharedViewModel vm = new ViewModelProvider(requireActivity()).get(TabSharedViewModel.class);
vm.getTrendingTab().observe(this, isTrending -> updateUI(isTrending));

避坑指南

  • 不要依賴 TabActivity(已棄用),改用 Fragment + ViewPager 或 TabLayout。
  • 若必須用舊 API,切記 getIntent() 不會更新,需用 onNewIntent() 配合 setIntent(),但 Tab 切換不觸發此流程。
  • 數據共享首選 ViewModel/LiveData,生命周期感知且防內存洩漏。

拋棄「Intent 傳遞 Tab 狀態」的錯誤思維,擁抱組件化通信模式,代碼更健壯易維護。

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