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

Android TabHost Badge 數字跨 Activity 實時更新方案

     編輯:程式設計綜合問答

場景

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);

方案三:SharedPreferences + onResume 輪詢(簡單場景)

// 寫入(其他 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 + LiveData(現代架構,推薦新專案)

// 共享 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生命周期感知、響應式、無洩漏需架構組件依賴新專案、模組化架構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved