android - 打开具有多个内部 Intent 的应用程序并等待结果

标签 android android-intent android-activity startactivityforresult

我有一个应用程序 (APP1) 应该打开其他应用程序 (APP2) 并等待结果。我就是这样做的。

private fun startBridgeActivity(fileName: String, isProduction: Boolean) {
        val intent = Intent(Intent.ACTION_MAIN)
        when (isProduction) {
            true -> {
                intent.component = ComponentName(
                    "com.myapp",
                    "com.myapp.view.ui.ItemSelectionActivity"
                )
            }
            else -> {
                intent.component = ComponentName(
                    "com.myapp.dev",
                    "com.myapp.view.ui.ItemSelectionActivity"
                )
            }
        }
        try {
            startActivityForResult(intent, REQUEST_CODE)
        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(this@MainActivity, "This activity does not exist", Toast.LENGTH_LONG).show()
        }
    }

然后 APP2 收到这个 Intent 并打开自己。这个APP2的启动方式是标准的。 APP2内部导航如下:

ReceiverActivity - Step1Activity - Step2Activity - LastActivity

我尝试设置结果并完成 LastActivity,但它不起作用。还尝试使用 finishAffinityfinishAndRemoveTasks 但它们也没有用。

然后我所做的就是从 LastActivity 调用 ReceiverActivity 并在那里设置结果并完成它。但这让我留在主屏幕上,结果不会到达 APP1。

val receiverActivityIntent = Intent(this@LastActivity, ReceiverActivity::class.java)
        receiverActivityIntent.putExtra("end", true)
        TaskStackBuilder.create(this@ReceiverActivity)
                .addParentStack(ReceiverActivity::class.java)
                .addNextIntent(receiverActivityIntent)
                .startActivities()
        finish()

我读了一些其他的 SO 答案,其中有人写道来自 APP1 的 Activity 将被添加到 APP2 的堆栈中,这可能就是应用程序进入主屏幕的原因。

我们将不胜感激。

谢谢。

最佳答案

您的应用使用 startActivityForResult() 启动 ItemSelectionActivity。当 ItemSelectionActivity 完成时,您的应用将获得回调 onActivityResult()。它会收到 ItemSelectionActivity 在调用 setResult() 时设置的结果。

如果 ItemSelectionActivity 需要先启动其他 Activity,然后才能将结果发送回您的应用,您可以通过几种可能的方式执行此操作:

  1. 使用FLAG_ACTIVITY_FORWARD_RESULT

ItemSelectionActivity 启动另一个 Activity 时,它应该在 Intent 中设置标志 Intent.FLAG_ACTIVITY_FORWARD_RESULT 并调用startActvity()(不要调用 startActivityForResult()。正在启动的 Activity 必须调用 setResult() 和结果,该数据将传回您的应用程序。您基本上是将一个 Activity 的结果请求“转发”到下一个。因为你看起来要在获得结果之前要经历多个 Activity ,您可以继续将责任从一个 Activity 转发到下一个 Activity。链中的最后一个应该然后调用 setResult(),这些结果将在 onActivityResult() 中传回您的应用。

  1. startActivityForResult() 调用:

ItemSelectionActivity 启动另一个 Activity 时,它应该调用 startActvityForResult()。正在启动的 Activity 必须随后调用 setResult() 并将结果传递回 onActivityResult 中的 ItemSelefctionActivity ()ItemSelectionActivity 本身应该使用数据和 finish() 调用 setResult()。结果将传回您的应用程序。由于在获得结果之前似乎有几个 Activity 要完成,因此您可以继续链接这些调用,以便每个 Activity 使用 starActivityForResult 启动下一个 Activity () 和被调用的 Activity 需要使用 setResult()` 将结果传回。

  1. LastActivity 将结果传递给 ItemSelectionActivity:

这是您已经尝试实现的解决方案。 LastActivity 将结果直接返回给 ItemSelectionActivity。但是,您的实现已损坏。 不要使用 TaskStackBuilder 来完成此操作! TaskStackBuilder 有很多副作用会破坏 Activity 堆栈任务。你想要做的是:

val receiverActivityIntent = Intent(this@LastActivity, ReceiverActivity::class.java)
receiverActivityIntent.putExtra("end", true)
// add the results to the Intent
receiverActivityIntent.putExtra("results", results)
// Set the CLEAR_TOP and SINGLE_TOP flags (if necessary) to remove any
//  activities that are on the stack between ReceiverActivity and LastActivity
receiverActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
    Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(receiverActivityIntent)
// Calling finish() here isn't necessary if you set the Intent flags
finish()

注意:我的 Kotlin 语法可能不是 100% 正确,但希望你能理解。

使用此解决方案,结果将传送到 onNewIntent() 中的 ReceiverActivity。您将需要覆盖 onNewIntent(),从传递的 Intent 中获取结果,然后使用结果调用 setResult() 以将它们传回到您的应用。

关于android - 打开具有多个内部 Intent 的应用程序并等待结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54670070/

相关文章:

android - 使用 savedInstanceState 和 onSaveInstanceState 重要吗?

android - 安卓方向传感器的奇怪行为

android - 在 android 中单击 gmail 通知时,在 Intent 选择器对话框中隐藏我的应用程序

android - ACTION_CHOOSER 和 ACTION_PICK_ACTIVITY 之间的 Intent 解析和区别

android - 从 Activity A->B->C 导航 - 如何在 onBackPressed() 中将数据从 C 传递到 A?

android - 从 View 中调用电话

android - 仅当版本为 11+ 时如何使用函数

Android Activity 不断恢复保存的实例状态

java - 将 ArrayList 写入/读取文件的奇怪问题

android - 如何使用类似于 lazylist 概念的数据库响应来显示图像?