Android中PendingIntent创建的任务无法再次通过PendingIntent启动新Activity如何解决
解决方案
你遇到的问题由三个核心原因导致,按以下步骤修改即可实现每次点击通知都新建Message Activity实例:
1. 给启动Activity的Intent添加必要标记
从BroadcastReceiver上下文启动Activity必须加ActivityFlags.NewTask,如果需要每次跳转都在现有任务栈新建Message实例,不需要额外加其他启动标记;如果需要每个Message都在独立任务栈打开,再加ActivityFlags.MultipleTask。还可以给Intent设置唯一action避免系统复用匹配:
Intent intent = new Intent((Context)BroadcastContext, typeof(InfiniteScrollingParentFsActivity)); // 非Activity上下文启动Activity必须添加该标记 intent.AddFlags(ActivityFlags.NewTask); // 可选:需要每个Message在独立任务栈时添加下面这句 // intent.AddFlags(ActivityFlags.MultipleTask); // 设置唯一action,避免系统判定为相同Intent导致复用 intent.SetAction(Guid.NewGuid().ToString()); // 原有携带参数的逻辑保留 intent.PutExtra(……);
2. 修正PendingIntent的标志位配置
安卓12(API 31)及以上强制要求PendingIntent明确声明可变性,禁止传0作为flag,否则会出现匹配异常,无法正常触发跳转:
PendingIntentFlags pendingFlags; if (Build.VERSION.SdkInt >= BuildVersionCodes.S) { // 如果后续需要修改PendingIntent携带的extra用Mutable,不需要则用Immutable性能更好 pendingFlags = PendingIntentFlags.Immutable | PendingIntentFlags.UpdateCurrent; } else { pendingFlags = PendingIntentFlags.UpdateCurrent; } PendingIntent pendingIntent = PendingIntent.GetActivity((Context)BroadcastContext, notificationId, intent, pendingFlags);
原理解释
- 非Activity上下文(比如BroadcastReceiver、Application)启动Activity必须加
FLAG_ACTIVITY_NEW_TASK,否则系统不会新建Activity,仅会将已存在的应用任务切到前台 - 安卓12以上未指定可变性的PendingIntent会被系统静默拦截,不会触发跳转逻辑
- 给Intent设置唯一action可以避免系统将不同通知的跳转请求判定为重复Intent,保证每次都新建Activity实例
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

