TabActivity 包含兩個 Tab,每個 Tab 關聯一個 Activity。切換 Tab 時,目標 Activity 的 onResume() 早於 Tab 切換監聽器執行,導致通過 Intent.putExtra() 傳遞的標識(如 isTrendingTab)無法被正確接收。
TabHost 內部機制:Tab 內容 Activity 在首次創建後會被保持,切換 Tab 只是顯示/隱藏,不會重新啟動 Activity。因此 onCreate()、onNewIntent() 不會再次調用,getIntent() 返回的是首次啟動時的 Intent。
// 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(需 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。getIntent() 不會更新,需用 onNewIntent() 配合 setIntent(),但 Tab 切換不觸發此流程。拋棄「Intent 傳遞 Tab 狀態」的錯誤思維,擁抱組件化通信模式,代碼更健壯易維護。