You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android API33下点击通知项不恢复Activity的实现问题

解决方案

核心思路是避免使用启动Activity的PendingIntent,改用广播接收器处理通知项的点击逻辑,这样点击后不会唤起应用界面,保持后台最小化状态。以下是适配API33的完整修改方案:

1. 创建广播接收器

新建类处理通知点击的广播事件:

class NotificationActionReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        // 在这里处理Item1的点击逻辑,比如执行后台操作、更新通知等
        intent?.getStringExtra("NotificationMessage")?.let { message ->
            Log.d("NotificationAction", "收到消息: $message")
        }
    }
}

2. 动态注册广播接收器(适配API33+)

在MainActivity的onCreate中动态注册接收器,规避静态注册的权限限制:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    
    // 动态注册广播接收器
    val filter = IntentFilter("NOTIFICATION_ACTION_ITEM1")
    registerReceiver(NotificationActionReceiver(), filter)
    
    showNotification()
}

3. 修改通知的PendingIntent配置

将原启动Activity的Intent替换为发送广播的Intent,对应的PendingIntent改用getBroadcast:

private fun showNotification() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val name: CharSequence = "My Notification"
        val description = "My notification description"
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val notificationChannel = NotificationChannel("CHANNEL_ID", name, importance)
        notificationChannel.description = description
        val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(notificationChannel)
        notificationChannel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
    }

    // 替换为广播Intent
    val item1Intent = Intent("NOTIFICATION_ACTION_ITEM1")
    item1Intent.putExtra("NotificationMessage", "extra1")
    
    // 创建广播类型的PendingIntent
    val item1PIntent = PendingIntent.getBroadcast(
        this,
        0,
        item1Intent,
        PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

    val builder = NotificationCompat.Builder(this, "CHANNEL_ID")
        .setSmallIcon(R.mipmap.ic_launcher)
        .addAction(
            com.google.android.material.R.drawable.ic_arrow_back_black_24,
            "Item 1",
            item1PIntent
        )
        // 若不需要点击通知主体唤起应用,可移除该行
        // .setContentIntent(item1PIntent)
        .setOngoing(true)
        .setLargeIcon(BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher))

    val notificationManagerCompat = NotificationManagerCompat.from(this)
    notificationManagerCompat.notify(1, builder.build())
}

关键说明

  • 移除原Intent中启动MainActivity的配置,改用自定义广播Action,确保点击通知项后不会唤起应用界面。
  • API33及以上对静态广播接收器有严格权限限制,动态注册是更稳妥的实现方式。
  • 若无需点击通知主体唤醒应用,直接删除setContentIntent(item1PIntent)即可彻底避免应用被激活。

内容的提问来源于stack exchange,提问作者gekomad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:05:27