Android 14中TileService启动Activity受限问题及解决方法
解决Android 14中TileService无法启动Activity的问题
Android 14对TileService的行为新增了安全限制,禁止直接调用startActivity()或startActivityAndCollapse()启动Activity,必须通过PendingIntent实现该需求,具体实现步骤如下:
创建启动目标Activity的Intent
val intent = Intent(this, TargetActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK }构建PendingIntent(Android 12+建议添加
FLAG_IMMUTABLE)val pendingIntent = PendingIntent.getActivity( this, 0, // 请求码可根据业务需求调整 intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE )在TileService的
onClick()方法中,使用新增API启动并手动折叠面板override fun onClick() { super.onClick() pendingIntent?.let { // Android 14专属API:通过PendingIntent启动Activity launchActivityFromPendingIntent(it) // 手动折叠快捷设置面板,替代原startActivityAndCollapse()的折叠逻辑 collapsePanel() } }
关键说明
- Android 14要求TileService启动Activity必须通过PendingIntent,直接传入Intent会触发安全校验抛出异常
launchActivityFromPendingIntent()是Android 14为TileService新增的API,专门用于适配该限制- 原
startActivityAndCollapse()包含的"启动+折叠"逻辑需要拆分,手动调用collapsePanel()完成面板折叠
多版本兼容实现
如果需要兼容Android 13及更低版本,可以添加版本判断:
override fun onClick() { super.onClick() val intent = Intent(this, TargetActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { val pendingIntent = PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) launchActivityFromPendingIntent(pendingIntent) collapsePanel() } else { // 低版本沿用原有逻辑 startActivityAndCollapse(intent) } }
内容的提问来源于stack exchange,提问作者Style-7
相关产品推荐
相关产品推荐

