如何实现从通知打开ActivityB后,点击桌面图标仍恢复该Activity?
问题:点击桌面图标无法回到之前的ActivityB,如何实现?
场景描述
- 用户点击通知后,应用打开并跳转至指定Activity(命名为ActivityB);
- 用户点击Home键,应用被最小化,
OnSaveInstanceState()方法被调用; - 从最近任务列表打开应用,会回到ActivityB(该Activity被恢复);但点击桌面应用图标打开时,会创建新实例并进入SplashActivity(
OnCreate()的savedInstanceState参数为Null)。需求是点击桌面图标时也能回到ActivityB。
相关代码
var intent = new Intent(ApplicationContext, Java.Lang.Class.FromType(typeof(SplashActivity))); intent.SetAction(notificationBody.ClickAction); intent.PutExtras(bundle); var pendingIntent = PendingIntent.GetActivity(ApplicationContext, (int)DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), intent, PendingIntentFlags.Immutable); var notificationBuilder = new NotificationCompat.Builder(ApplicationContext, CHANNEL_ID) .SetAutoCancel(true) .SetContentTitle(notificationBody.Title) .SetContentText(notificationBody.Body) .SetContentIntent(pendingIntent); notificationManager.Notify(notificationBody.Tag ?? Guid.NewGuid().ToString(), (int) DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), notificationBuilder.Build());
解决方案
1. 配置SplashActivity的启动模式
在AndroidManifest.xml中修改SplashActivity的属性,确保任务栈复用:
<activity android:name=".SplashActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="false"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
launchMode="singleTask":点击桌面图标时,系统会复用已存在的应用任务栈,而非创建新栈和Activity实例。taskAffinity="":确保该Activity属于应用默认任务栈,避免和其他应用任务栈混淆。
2. 修改SplashActivity的OnCreate逻辑
在SplashActivity的OnCreate方法中,判断任务栈状态,避免重复创建实例:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 若当前Activity不是任务栈根节点,说明后台已有运行的Activity,直接关闭Splash if (!IsTaskRoot) { Finish(); return; } // 仅首次启动时执行的初始化/跳转逻辑 // StartActivity(new Intent(this, typeof(MainActivity))); // Finish(); }
IsTaskRoot会判断当前Activity是否是任务栈的首个Activity,若非则直接finish,系统会自动显示栈顶的ActivityB。
3. 优化通知的PendingIntent配置
给通知的Intent添加栈复用标记,确保点击通知时正确关联已有任务栈:
var intent = new Intent(ApplicationContext, Java.Lang.Class.FromType(typeof(SplashActivity))); intent.SetAction(notificationBody.ClickAction); intent.PutExtras(bundle); // 添加Flags保证任务栈复用 intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop); var pendingIntent = PendingIntent.GetActivity(ApplicationContext, (int)DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), intent, PendingIntentFlags.Immutable);
ActivityFlags.ClearTop:若ActivityB已在栈中,清除其上方所有Activity,让它成为栈顶。ActivityFlags.SingleTop:若目标Activity已是栈顶,不会创建新实例,而是触发OnNewIntent方法。
内容的提问来源于stack exchange,提问作者Saksham Chaudhary
相关产品推荐
相关产品推荐

