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

Android单Activity架构下如何将浏览器分享URL传递给NavGraph内的Fragment

导航架构下浏览器分享URL到指定Fragment实现方案

1. 修正MainActivity逻辑

原有代码直接在onCreate中获取导航控制器会因NavHostFragment未完成初始化容易导致导航失败,同时需要兼容应用已在后台运行的分享场景,修改后代码如下:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 处理冷启动时的分享Intent
        handleShareIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // 处理应用已运行时收到的新分享Intent
        handleShareIntent(intent)
    }

    private fun handleShareIntent(intent: Intent?) {
        if (intent?.action == Intent.ACTION_SEND && "text/plain" == intent.type) {
            intent.getStringExtra(Intent.EXTRA_TEXT)?.let { url ->
                // 正确获取NavController:先获取NavHostFragment实例
                val navHostFragment = supportFragmentManager.findFragmentById(R.id.navHostFragment) as NavHostFragment
                val navController = navHostFragment.navController
                val bundle = Bundle().apply {
                    putString("urlFromWeb", url)
                }
                // 避免重复导航:当前页面已经是saveFragment时不重复跳转
                if (navController.currentDestination?.id != R.id.saveFragment) {
                    navController.navigate(R.id.saveFragment, bundle)
                }
            }
        }
    }
}

2. 导航图参数配置(推荐)

在main_navigation_file.xml中为saveFragment节点下配置接收参数,避免传参类型错误:

<fragment
    android:id="@+id/saveFragment"
    android:name="你的应用包名.saveF"
    android:label="saveF" >
    <argument
        android:name="urlFromWeb"
        app:argType="string"
        android:defaultValue="@null" />
</fragment>

3. saveFragment接收参数处理

在saveF的onViewCreated方法中获取传递的URL并执行存储逻辑:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val shareUrl = arguments?.getString("urlFromWeb")
    shareUrl?.let {
        // 执行你的URL存储逻辑
        saveUrlToLocal(it)
    }
}

4. 确认Manifest配置

确保AndroidManifest.xml中MainActivity节点已经配置分享接收的intent-filter,否则浏览器无法找到你的应用:

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:18:00