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

Android 12(API31)中BroadcastReceiver启动Activity异常,Android11为何无此问题?

Android 12+ 无法从BroadcastReceiver启动Activity,但Android 11可行的原因解析

你的代码在Android 11及以下正常运行,但Android 12+中只能取消通知却无法启动Activity,核心原因是两个版本对后台启动Activity的豁免规则差异:

1. Android 11(API30)的后台启动豁免逻辑

Android 11虽然引入了后台启动Activity的限制,但针对通知PendingIntent触发的BroadcastReceiver有明确豁免:

  • 当BroadcastReceiver是由用户点击通知按钮触发时,onReceive方法属于用户主动交互的上下文范畴,系统允许在此场景下直接启动Activity,无需额外权限。
  • 你的场景正好符合这个豁免条件,所以Android 11可以正常启动SplashScreenActivity。

2. Android 12+(API31及以上)的规则收紧

Android 12开始,系统进一步严格限制了后台启动Activity的场景,即使是通知触发的BroadcastReceiver,也不再默认豁免:

  • 此时只有两种情况能在后台启动Activity:
    • 应用持有SYSTEM_ALERT_WINDOW特殊权限;
    • 启动操作在前台服务的上下文中执行。
  • 而NotificationManager.Cancel()不属于启动Activity的操作,不受后台启动限制,所以通知能正常取消。

补充验证与替代方案

  • 如果你把通知的操作直接设置为启动SplashScreenActivity的PendingIntent(跳过BroadcastReceiver中转),Android 12+也能正常启动,这说明BroadcastReceiver的场景被单独纳入了限制范围。
  • 除了申请SYSTEM_ALERT_WINDOW权限,也可以考虑调整逻辑,直接用通知PendingIntent启动Activity,避免通过BroadcastReceiver中转,这样更符合Android 12+的设计规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:52:49