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

如何实现从通知打开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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:15:25