登錄頁面跳轉回主頁(含 TabHost),需恢復登錄前狀態並切換到「我的」Tab,同時更新頂部佈局顯示用戶信息。
startActivity(MainActivity) 會創建新實例,導致 TabHost 重置setCurrentTabByTag 對非當前實例無效<activity
android:name=".MainActivity"
android:launchMode="singleTop" />
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("need_refresh", true);
intent.putExtra("target_tab", "wode"); // Tab 標識
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish(); // 關閉登錄頁
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent); // 更新 getIntent() 返回值
handleLoginIntent(intent);
}
@Override
protected void onResume() {
super.onResume();
handleLoginIntent(getIntent());
}
private void handleLoginIntent(Intent intent) {
if (intent != null && intent.getBooleanExtra("need_refresh", false)) {
String targetTab = intent.getStringExtra("target_tab");
if ("wode".equals(targetTab)) {
tabHost.setCurrentTabByTag("wode");
}
// 更新頂部佈局:顯示用戶信息
updateHeaderWithUserInfo();
// 清除標記,防止重複執行
intent.removeExtra("need_refresh");
}
}
若不想用 singleTop,可在登錄成功後發送事件,主頁訂閱事件更新 UI:
// 登錄成功後
EventBus.getDefault().post(new LoginSuccessEvent(userInfo));
// MainActivity
@Subscribe(threadMode = ThreadMode.MAIN)
public void onLoginSuccess(LoginSuccessEvent event) {
updateHeader(event.userInfo);
tabHost.setCurrentTabByTag("wode");
}
singleTop + FLAG_ACTIVITY_CLEAR_TOP 復用主頁實例onNewIntent 處理攜帶數據TabHost 初始化完成後調用(onResume 安全)MainActivity 靜態引用導致內存洩漏