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

Android Notification 點擊跳轉失效:多通知 PendingIntent 衝突解決

     編輯:程式設計綜合問答

問題現象

發送多條通知,只有第一條點擊能跳轉,其餘點擊後通知消失但不跳轉。

代碼片段:


PendingIntent pi = PendingIntent.getActivity(context, 1, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

根本原因

requestCode 固定為 1,導致所有通知共用同一個 PendingIntent 對象。系統按 (requestCode, intent, flags) 三元組識別 PendingIntent,相同 requestCode 會覆蓋前一個,最終只有最後一條通知的 Intent 生效。

解決方案

  1. 分配唯一 requestCode:使用通知 ID、時間戳、隨機數等。
    
    int requestCode = (int) System.currentTimeMillis(); // 或 notificationId
    PendingIntent pi = PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
  2. 設置正確 Flag:
    • PendingIntent.FLAG_UPDATE_CURRENT:同一 requestCode 更新 Intent 數據。
    • PendingIntent.FLAG_IMMUTABLE(Android 12+ 必須)。
    • Intent 端:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP)。

完整最佳實踐代碼


public static void showNotification(Context context, int notifyId, String title, String content, Intent targetIntent) {
    PendingIntent pi = PendingIntent.getActivity(
        context,
        notifyId,                    // 唯一 requestCode
        targetIntent,
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
    );

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
        .setContentTitle(title)
        .setContentText(content)
        .setSmallIcon(R.drawable.ic_notification)
        .setContentIntent(pi)
        .setAutoCancel(true);

    NotificationManagerCompat.from(context).notify(notifyId, builder.build());
}

關鍵點總結

問題原因修復
多通知跳轉同一目標requestCode 重複使用 notifyId 或時間戳作為 requestCode
數據未更新PendingIntent 緩存舊 Intent加 FLAG_UPDATE_CURRENT
Android 12+ 崩潰缺少 FLAG_IMMUTABLE/MUTABLE顯式聲明 Flag
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved