Android清除通知欄的對應的消息

轉載請以鏈接形式標明出處:
本文出自:103style的博客


記錄一下

大致思路

  • 我們收到推送消息的時候會通過 NotificationManager.notify(int id, Notification notification) 發送到通知欄。
  • 記錄每一個顯示的 通知欄消息 和 對應的 id.
  • 按產品要求在進入對應的頁面的時候通過 NotificationManager.cancel(id) 刪除對應的通知欄消息。

僞代碼

通過sendNotification(...)顯示推送消息,在對應的界面調用類似 cleanMsgNotify(int notice) 清除推送消息即可。

public static final String CHANNEL_ID = "XXXX";
private static NotificationManager mNotificationManager;
private static List<PushMessageBean> notifyList;

public synchronized static void cleanMsgNotify(int notice) {
    if (mNotificationManager == null
            || notifyList == null || notifyList.size() == 0) {
        return;
    }
    for (int i = notifyList.size() - 1; i >= 0; i--) {
        PushMessageBean t = notifyList.get(i);
        if (t.notice == notice) {
            mNotificationManager.cancel(t.notifyId);
            notifyList.remove(i);
        }
    }
}
public void sendNotification(Context context, PushMessageBean message) {
    if (TextUtils.isEmpty(message.message)) {
        return;
    }
    NotificationCompat.Builder mBuilder;
    int notifyId = (int) System.currentTimeMillis();
    if (mNotificationManager == null) {
        mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    }
    registerNotificationChannel();
    mBuilder = new NotificationCompat.Builder(context, CHANNEL_ID);
    mBuilder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
            .setAutoCancel(true)
            .setContentText(message.message)
            .setSmallIcon(R.drawable.ic_launchers_round)
            .setVibrate(new long[]{1000})
            .setColor(context.getResources().getColor(R.color.color_primary))
            .setVisibility(Notification.VISIBILITY_PUBLIC)
            .setStyle(new NotificationCompat.BigTextStyle().bigText(message.message));
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {//7.0以上不需要title
        mBuilder.setContentTitle(context.getResources().getString(R.string.app_name));
    }
    message.notifyId = notifyId;
    saveNotification(message);
    mNotificationManager.notify(notifyId, mBuilder.build());
}
private void saveNotification(PushMessageBean message) {
    if (notifyList == null) {
        notifyList = new ArrayList<>();
    }
    notifyList.add(message);
}
private void registerNotificationChannel() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel notificationChannel = mNotificationManager.getNotificationChannel(CHANNEL_ID);
        if (notificationChannel == null) {
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                    CHANNEL_ID, NotificationManager.IMPORTANCE_HIGH);
            channel.enableLights(true); //是否在桌面icon右上角展示小紅點
            channel.setLightColor(Color.RED); //小紅點顏色
            //channel.setShowBadge(true); //是否在久按桌面圖標時顯示此渠道的通知
            mNotificationManager.createNotificationChannel(channel);
        }
    }
}

以上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章