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

Android Notification 數字疊加顯示:正確累計未讀計數的實現

     編輯:程式設計綜合問答

問題現象

每次收到通知創建新 Notification 對象,導致 notification.number 始終為 1,無法累計未讀數量。

根本原因

new Notification() 每次創建實例,number 字段重置為 0 再 +1。需復用同一 Notification 實例或手動維護計數。

解決方案一:靜態變量持有 Notification 實例(簡單)

public class MainActivity extends Activity {
    private static Notification notification; // 靜態保持單例
    private static int unreadCount = 0;
    private NotificationManager nm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    }

    private void showNotification() {
        if (notification == null) {
            notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle("新消息")
                .setAutoCancel(true)
                .build();
        }
        unreadCount++;
        notification.number = unreadCount; // 累加
        nm.notify(NOTIFY_ID, notification);
    }
}

解決方案二:SharedPreferences 持久化計數(跨進程/重啟保持)

private void updateNotification() {
    SharedPreferences sp = getSharedPreferences("notify", MODE_PRIVATE);
    int count = sp.getInt("unread", 0) + 1;
    sp.edit().putInt("unread", count).apply();

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle("新消息 (" + count + ")")
        .setNumber(count) // 設置 number 字段
        .setAutoCancel(true);
    nm.notify(NOTIFY_ID, builder.build());
}

方案三:NotificationChannel 級別計數(Android 8.0+ 推薦)

Android O 引入 Channel,可通過 NotificationChannel.setShowBadge(true) 顯示角標,但數字需 Launcher 支持。應用層面仍需自行維護 Notification.number。

關鍵點總結

  • Notification.number 僅在同一 notify(id, notification) ID 下累加有效,不同 ID 互不影響。
  • 使用 NotificationCompat.Builder 替代棄用的 new Notification()。
  • Android 8.0+ 必須創建 NotificationChannel 才能顯示通知。
  • 清除計數:notification.number = 0; nm.notify(id, notification); 或 nm.cancel(id)。

避坑指南

  1. 不要在循環/回調中 new Notification(),改用 Builder 模式復用或重建並設置正確 number。
  2. 多進程應用(如 :remote Service)需用 ContentProvider 或 SharedPreferences(MULTI_PROCESS) 同步計數。
  3. 角標顯示依賴 Launcher 實現(部分國產 ROM 不支持),number 僅作數據攜帶。

正確維護 Notification 實例與計數邏輯,讓未讀數字準確疊加,提升用戶感知體驗。

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