TabActivity 包含 5 個 Tab,第 4 個 Tab 顯示 Badge(如未讀訊息數)。需在其他 Activity 操作後,更新 Badge 數值並即時顯示。
// TabActivity
public static TabWidget tabs;
// 其他 Activity
TabWidget tabs = TabActivity.tabs;
BadgeView badge = new BadgeView(context, tabs, 3); // 索引 3 為第 4 個 Tab
badge.setText(String.valueOf(newCount));
badge.show();
缺點:強耦合、記憶體洩漏風險、進程重建後靜態欄位清空。
// TabActivity 註冊接收器
private BroadcastReceiver badgeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int count = intent.getIntExtra("badge_count", 0);
updateBadge(count);
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(badgeReceiver, new IntentFilter("UPDATE_TAB_BADGE"));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(badgeReceiver);
}
private void updateBadge(int count) {
if (badgeView != null) {
if (count > 0) {
badgeView.setText(String.valueOf(count));
badgeView.show();
} else {
badgeView.hide();
}
}
}
// 其他 Activity 發送廣播
Intent intent = new Intent("UPDATE_TAB_BADGE");
intent.putExtra("badge_count", newCount);
sendBroadcast(intent);
// 寫入(其他 Activity)
SharedPreferences sp = getSharedPreferences("badge_prefs", MODE_PRIVATE);
sp.edit().putInt("tab3_badge", newCount).apply();
// 讀取並更新(TabActivity onResume)
@Override
protected void onResume() {
super.onResume();
SharedPreferences sp = getSharedPreferences("badge_prefs", MODE_PRIVATE);
int count = sp.getInt("tab3_badge", 0);
updateBadge(count);
}
// 共享 ViewModel(需依賴 lifecycle-viewmodel)
public class BadgeViewModel extends ViewModel {
private MutableLiveData<Integer> badgeCount = new MutableLiveData<>(0);
public LiveData<Integer> getBadgeCount() { return badgeCount; }
public void setBadgeCount(int count) { badgeCount.setValue(count); }
}
// TabActivity 觀察
new ViewModelProvider(this).get(BadgeViewModel.class)
.getBadgeCount()
.observe(this, count -> updateBadge(count));
// 其他 Activity 更新
new ViewModelProvider(this).get(BadgeViewModel.class)
.setBadgeCount(newCount);
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 靜態引用 | 代碼最少 | 洩漏、耦合、進程死不生效 | Demo/臨時測試 |
| 廣播 | 解耦、跨進程可擴展 | 需註冊/反註冊、Intent 開銷 | 傳統專案、跨模組通訊 |
| SP + onResume | 極簡、持久化 | 非即時、頻繁讀寫 IO | 低頻更新、無即時要求 |
| ViewModel + LiveData | 生命周期感知、響應式、無洩漏 | 需架構組件依賴 | 新專案、模組化架構 |