Android:复用Activity接收Files文件后返回Files异常的解决方法及疑问
问题解决方案
一、先解决onNewIntent收到默认Intent的问题
你之前遇到的onNewIntent拿到的不是SEND Intent,核心原因有两个:
- onCreate里的冗余代码直接覆盖了原始Intent:你在
onCreate开头就启动了一个不带任何Action的自身Activity,这直接把Files发来的SEND Intent冲没了,完全没必要。 - 未在
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
相关产品推荐
相关产品推荐

