Android 12点击通知操作按钮后如何取消通知(替代BroadcastReceiver方案)
解决Android 12+点击通知操作按钮后通知不消失的问题
先澄清一个误解
Android 12+的通知蹦床限制,只禁止从BroadcastReceiver/Service中启动Activity的行为。如果你的BroadcastReceiver仅仅是用来取消通知,完全不涉及启动Activity,那这种用法是合规的,完全可以继续沿用之前的实现。
方案1:继续使用BroadcastReceiver(仅处理取消通知)
只要你的BroadcastReceiver里不启动Activity,就不会触发蹦床限制。可以继续用原来的代码,注意给PendingIntent设置符合Android 12+的flag(FLAG_IMMUTABLE或FLAG_MUTABLE,根据是否需要修改Intent决定):
构建通知Action的PendingIntent时:
Intent cancelIntent = new Intent(context, NotificationBroadcastReceiver.class); cancelIntent.putExtra("notificationId", notificationId); PendingIntent pendingCancelIntent = PendingIntent.getBroadcast( context, 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE // Android 12+必须加这个flag ); NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) .setContentTitle("通知标题") .setContentText("通知内容") .addAction(R.drawable.ic_cancel, "取消", pendingCancelIntent);
BroadcastReceiver的代码和你之前的一样(确保不启动Activity):
private class NotificationBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); final int NOTIFICATION_ID = intent.getIntExtra("notificationId", 0); mNotificationManager.cancel(NOTIFICATION_ID); } }
方案2:在目标Activity中取消通知
如果你的通知操作按钮确实需要启动Activity,那可以把通知ID通过Intent传递给Activity,在Activity的生命周期方法里取消通知:
- 构建指向Activity的PendingIntent时传入notificationId:
Intent activityIntent = new Intent(context, TargetActivity.class); activityIntent.putExtra("notificationId", notificationId); PendingIntent pendingActivityIntent = PendingIntent.getActivity( context, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) .setContentTitle("通知标题") .setContentText("通知内容") .addAction(R.drawable.ic_open, "打开页面", pendingActivityIntent);
- 在TargetActivity中取消通知:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_target); int notificationId = getIntent().getIntExtra("notificationId", 0); if (notificationId != 0) { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(notificationId); } } // 如果Activity是singleTop或singleTask模式,还要处理onNewIntent @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); int notificationId = intent.getIntExtra("notificationId", 0); if (notificationId != 0) { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(notificationId); } }
方案3:利用通知的自动取消特性(仅适用于点击通知主体的情况)
如果是点击通知主体(不是操作按钮)要让通知消失,可以直接给NotificationCompat.Builder设置setAutoCancel(true),这样点击通知主体后系统会自动取消通知:
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) .setContentTitle("通知标题") .setContentText("通知内容") .setAutoCancel(true) // 点击通知主体自动取消 .setContentIntent(pendingActivityIntent);
但这个方法对操作按钮的点击无效,操作按钮的点击还是需要手动处理取消。
内容的提问来源于stack exchange,提问作者joghm
相关产品推荐
相关产品推荐

