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

NavDeepLinkBuilder能否复用现有Activity实例而非创建新实例?

Android点击通知唤起已有Activity中对应Fragment实现方案

核心实现逻辑为通过指定Activity启动模式避免新建实例,配合Intent携带跳转参数,让已有Activity接收参数后触发Fragment切换。

第一步:配置Activity启动模式

在AndroidManifest.xml中为承载Fragment的目标Activity设置启动模式,避免点击通知时创建新的Activity实例:

<activity
    android:name=".MainActivity"
    android:launchMode="singleTop" />

可选singleTask启动模式,根据应用自身的页面栈逻辑选择即可

第二步:构造通知的PendingIntent

构造指向目标Activity的Intent,携带需要跳转的Fragment标识和所需参数,再封装为PendingIntent设置到通知中:

// 构造指向承载Fragment的Activity的Intent
val notifyIntent = Intent(context, MainActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP
    // 标记目标Fragment的标识
    putExtra("TARGET_FRAGMENT", "FRAGMENT_ORDER_DETAIL")
    // 可选:传递Fragment需要的业务参数,比如订单ID
    putExtra("ORDER_ID", "10086")
}

val pendingIntent = PendingIntent.getActivity(
    context,
    // 不同通知需设置不同的requestCode,避免参数被覆盖
    1001,
    notifyIntent,
    // Android12及以上必须显式指定IMMUTABLE或MUTABLE
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

// 将pendingIntent设置到Notification.Builder的setContentIntent方法即可

第三步:Activity接收参数切换Fragment

在Activity中同时处理首次启动和后台唤起的Intent参数,匹配到目标Fragment后执行切换逻辑:

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    // 更新Activity持有的Intent,避免后续读取到旧参数
    setIntent(intent)
    handleFragmentJump(intent)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    // 处理Activity被销毁后重建、首次启动的场景
    handleFragmentJump(intent)
}

private fun handleFragmentJump(intent: Intent?) {
    intent ?: return
    val targetTag = intent.getStringExtra("TARGET_FRAGMENT") ?: return
    // 移除参数,避免旋转屏幕等场景重复触发跳转
    intent.removeExtra("TARGET_FRAGMENT")

    when (targetTag) {
        "FRAGMENT_ORDER_DETAIL" -> {
            val orderId = intent.getStringExtra("ORDER_ID")
            val targetFragment = OrderDetailFragment().apply {
                arguments = Bundle().apply {
                    putString("order_id", orderId)
                }
            }
            // 执行Fragment切换,按自身项目实现调整:可以用原生Fragment事务、Navigation组件等方式
            supportFragmentManager.beginTransaction()
                .replace(R.id.fragment_container, targetFragment)
                .addToBackStack(null) // 按需决定是否加入返回栈
                .commitAllowingStateLoss()
        }
        // 其他Fragment的跳转分支按需扩展
        "FRAGMENT_MESSAGE" -> {
            // 对应切换逻辑
        }
    }
}

注意事项

  • 如果项目使用Navigation组件做页面导航,不需要自行编写Fragment事务,拿到参数后直接调用navController.navigate(目标Fragment的导航ID, 参数Bundle)即可
  • 如果希望点击通知返回时按应用原有页面栈逻辑返回,可在切换Fragment前自行补全前置页面的栈逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 11:15:04