發送多條通知,只有第一條點擊能跳轉,其餘點擊後通知消失但不跳轉。
代碼片段:
PendingIntent pi = PendingIntent.getActivity(context, 1, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
requestCode 固定為 1,導致所有通知共用同一個 PendingIntent 對象。系統按 (requestCode, intent, flags) 三元組識別 PendingIntent,相同 requestCode 會覆蓋前一個,最終只有最後一條通知的 Intent 生效。
int requestCode = (int) System.currentTimeMillis(); // 或 notificationId
PendingIntent pi = PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent.FLAG_UPDATE_CURRENT:同一 requestCode 更新 Intent 數據。PendingIntent.FLAG_IMMUTABLE(Android 12+ 必須)。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 |