跨应用Intent唤起App时如何自动导航至指定详情Fragment
实现方案
场景前提
- 双应用交互逻辑:App A内点击更新按钮可唤起App B
- App B架构:
MainActivity+ NavHostFragment 单Activity多Fragment架构,3个Fragment依次为闪屏页、应用列表页(RecyclerView承载可下载应用列表)、应用详情页(接收appName类型的navargs参数,点击下载按钮传入该参数发起下载请求) - 现有App A唤起代码:
private fun openAppStore(){ val intent = Intent() intent.component = ComponentName("com.package.name", "com.package.name.MainActivity") intent.putExtra("appName", "drivingApp") startActivity(intent) }
需求:App B被上述Intent唤起时,跳过列表页直接打开对应
appName的应用详情页,详情页原有下载逻辑无需修改。
分步实现
1. 读取启动Intent的传入参数
在MainActivity中定义变量暂存外部传入的目标应用名,覆盖冷启动和热启动两种场景的参数读取:
class MainActivity : AppCompatActivity() { private lateinit var navController: NavController // 存储外部跳转传入的目标应用名,null代表普通启动流程 var targetAppName: String? = null private set override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) navController = findNavController(R.id.nav_host_fragment) // 冷启动时读取Intent参数 targetAppName = intent.getStringExtra("appName") } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) // 热启动(App B已在后台)时读取新Intent的参数 targetAppName = intent?.getStringExtra("appName") } }
2. 调整导航图配置
打开App B的navigation导航配置文件,补充闪屏页直达详情页的导航动作,参数和列表页跳详情页保持一致,避免详情页读取参数的逻辑改动:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:startDestination="@id/splashFragment"> <fragment android:id="@+id/splashFragment" android:name="com.package.name.ui.SplashFragment" android:label="闪屏页"> <!-- 原有闪屏跳列表的动作 --> <action android:id="@+id/action_splash_to_appList" app:destination="@id/appListFragment" app:popUpTo="@id/splashFragment" app:popUpToInclusive="true"/> <!-- 新增闪屏直接跳详情的动作 --> <action android:id="@+id/action_splash_to_appDetail" app:destination="@id/appDetailFragment" app:popUpTo="@id/splashFragment" app:popUpToInclusive="true"> <argument android:name="appName" app:argType="string" android:defaultValue=""/> </action> </fragment> <fragment android:id="@+id/appListFragment" android:name="com.package.name.ui.AppListFragment" android:label="应用列表"> <action android:id="@+id/action_appList_to_appDetail" app:destination="@id/appDetailFragment"> <argument android:name="appName" app:argType="string"/> </action> </fragment> <fragment android:id="@+id/appDetailFragment" android:name="com.package.name.ui.AppDetailFragment" android:label="应用详情"> <argument android:name="appName" app:argType="string"/> </fragment> </navigation>
配置popUpToInclusive=true会把闪屏页从返回栈移除,避免用户进入页面后按返回键回到闪屏。
3. 修改闪屏页的跳转逻辑
在闪屏页原有初始化/倒计时结束后的跳转节点,判断是否存在外部传入的目标应用名,走不同跳转分支:
class SplashFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 模拟原有闪屏等待逻辑:SDK初始化、广告倒计时等 viewLifecycleOwner.lifecycleScope.launch { delay(2000) // 替换成你实际的闪屏等待时机 val hostActivity = requireActivity() as MainActivity val targetApp = hostActivity.targetAppName if (!targetApp.isNullOrBlank()) { // 存在外部跳转目标,直接导航到对应详情页 val directions = SplashFragmentDirections.actionSplashToAppDetail(targetApp) findNavController().navigate(directions) // 如果需要用户按返回键回到列表页而不是直接退出,替换成下面这段逻辑 /* findNavController().navigate( resId = R.id.action_splash_to_appList, args = null, navOptions = navOptions { popUpTo(R.id.splashFragment) { inclusive = true } } ) val listToDetailDir = AppListFragmentDirections.actionAppListToAppDetail(targetApp) findNavController().navigate(listToDetailDir) */ } else { // 普通启动,跳转到应用列表页 findNavController().navigate(SplashFragmentDirections.actionSplashToAppList()) } } } }
如果选择返回栈兼容逻辑,用户从外部唤起进入详情页后按返回键,会回到应用列表页,和用户手动从列表点击进入详情的交互完全一致,不会出现按返回直接退出App的突兀感。
4. 验证逻辑
上述修改完成后,App A点击更新按钮唤起App B时,会正常展示闪屏,闪屏结束后直接打开目标应用的详情页,详情页通过navargs拿到的appName和列表页跳转传入的值完全一致,原有下载按钮的逻辑不需要做任何修改即可正常触发对应应用的下载。
内容的提问来源于stack exchange,提问作者devick
相关产品推荐
相关产品推荐

