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

Chrome Custom Tabs中调用MainActivity ViewModel实现文章收藏的方法问询

解决Chrome Custom Tab调用MainActivity ViewModel实现文章收藏的问题

核心思路

Chrome Custom Tab的菜单项通过PendingIntent触发MainActivity时,无法直接调用ViewModel方法,需要通过Intent传递文章数据,再在MainActivity中接收数据并调用ViewModel的收藏逻辑。

步骤1:修改PendingIntent的Intent,传递文章数据

把需要收藏的文章关键信息(比如文章ID、标题、链接等)通过Intent的putExtra传递,若为自定义Article对象,需实现Parcelable接口才能直接传递。

修改启动代码如下:

// 替换为你实际的文章对象
val currentArticle = article 

// 1. 创建Intent,自定义Action用于区分收藏操作
val intent = Intent(requireContext(), MainActivity::class.java).apply {
    action = "ACTION_SAVE_ARTICLE"
    // 传递Parcelable类型的文章对象,基础类型可直接传对应值
    putExtra("EXTRA_ARTICLE", currentArticle)
    // 保持应用原有任务栈结构,避免重复创建页面
    addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
}

// 2. 创建PendingIntent,用FLAG_UPDATE_CURRENT确保传递的Extra能更新
val pendingIntent = PendingIntent.getActivity(
    requireContext(),
    100,
    intent,
    PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)

builder.addMenuItem("收藏文章", pendingIntent);

button.setOnClickListener {
    val url = "https://www.google.com" // 替换为实际文章链接
    val customTabsIntent: CustomTabsIntent = builder.build()
    customTabsIntent.launchUrl(requireActivity(), Uri.parse(url))
}

步骤2:在MainActivity中处理收藏Intent

重写onNewIntent方法(因使用FLAG_ACTIVITY_SINGLE_TOP,MainActivity不会重新创建,会触发该方法),接收Intent中的文章数据并调用ViewModel的saveArticle方法:

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: ArticleViewModel // 你的ViewModel实例

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        viewModel = ViewModelProvider(this)[ArticleViewModel::class.java]
        
        // 首次启动时检查Intent
        handleSaveArticleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        setIntent(intent) // 更新当前Intent
        handleSaveArticleIntent(intent)
    }

    private fun handleSaveArticleIntent(intent: Intent?) {
        intent?.takeIf { it.action == "ACTION_SAVE_ARTICLE" }?.let {
            // 获取传递的文章对象
            val article = it.getParcelableExtra<Article>("EXTRA_ARTICLE")
            article?.let { viewModel.saveArticle(it) }
            // 可添加提示告知用户收藏结果
            Toast.makeText(this, "文章已收藏", Toast.LENGTH_SHORT).show()
        }
    }
}

额外注意事项

  • 若Article未实现Parcelable,可拆分传递单个字段(如putExtra("ARTICLE_ID", article.id)),在MainActivity中用字段重新构造对象或直接调用ViewModel的收藏方法。
  • PendingIntent的requestCode建议唯一,比如用文章ID作为requestCode,避免不同收藏操作的PendingIntent被复用导致数据错误。
  • 确保ViewModel的saveArticle方法线程安全,涉及数据库写入时,建议用Coroutine或WorkManager处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:15:27