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

Android:复用Activity接收Files文件后返回Files异常的解决方法及疑问

问题解决方案

一、先解决onNewIntent收到默认Intent的问题

你之前遇到的onNewIntent拿到的不是SEND Intent,核心原因有两个:

  1. onCreate里的冗余代码直接覆盖了原始Intent:你在onCreate开头就启动了一个不带任何Action的自身Activity,这直接把Files发来的SEND Intent冲没了,完全没必要。
  2. 未在onNewIntent中更新Intent:singleTop模式下,新Intent会发送到onNewIntent,但默认情况下getIntent()返回的还是Activity启动时的旧Intent,必须手动调用setIntent(intent)更新,否则后续拿到的都是初始的默认Intent。

二、解决返回Files应用却打开自身的问题

这个问题源于你给启动Intent加了FLAG_ACTIVITY_NEW_DOCUMENT,这个Flag会强制让你的Activity在新的任务栈中启动,导致任务栈上下文脱离了Files应用。按返回键时,系统会认为当前任务栈只有你的应用,所以回到你的主页而非Files。


具体修正步骤

1. 删除冗余的启动代码

把onCreate里这几行完全没用的代码删掉:

// 删掉以下三行
val intent = Intent(this, this::class.java).apply {
    addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
}
startActivity(intent)

2. 正确实现Intent处理逻辑

把Intent处理逻辑抽成单独方法,同时在onCreate和onNewIntent中调用,确保启动时和后续新Intent都能被处理:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // ...你的其他初始化代码
    // 处理启动时的初始Intent
    handleIntent(intent)
}

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    // 关键:更新当前Activity的Intent为新传入的Intent
    setIntent(intent)
    // 复用处理逻辑
    handleIntent(intent)
}

// 统一处理所有Intent的方法
private fun handleIntent(intent: Intent?) {
    intent ?: return
    when (intent.action) {
        Intent.ACTION_SEND -> {
            val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                intent.getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java)
            } else {
                @Suppress("DEPRECATION")
                intent.getParcelableExtra(Intent.EXTRA_STREAM)
            }
            uri?.let {
                viewModel.importManager.importFromFiles(it)
            }
        }
        // 别忘了处理你在Manifest中声明的另外两个Action
        Intent.ACTION_OPEN_DOCUMENT, Intent.ACTION_GET_CONTENT -> {
            val uri = intent.data
            uri?.let {
                viewModel.importManager.importFromFiles(it)
            }
        }
    }
}

3. 确认Manifest配置

保持你的launchMode="singleTop"不变,不要给Activity添加任何会创建新任务栈的属性(比如android:taskAffinity或者额外的启动Flag),确保从Files发来的Intent能在正确的任务栈上下文启动你的Activity。


为什么这样改能解决返回问题?

去掉FLAG_ACTIVITY_NEW_DOCUMENT后,当你从Files分享文件时,系统会将你的Activity加载到Files应用的任务栈中(或复用你已有的栈顶实例),按返回键时,系统会顺着任务栈回到上一个页面——也就是Files应用,而不是你的应用主页。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:57:51