打开具有多个内部Intent的应用程序,然后等待结果

时间:2019-02-13 12:20:22

标签: 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收到此意图并自行打开。此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的活动将被添加到APP2的堆栈中,这可能就是该应用进入主屏幕的原因。

任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

  1. 使用FLAG_ACTIVITY_FORWARD_RESULT

ItemSelectionActivity启动另一个Activity时,应在Intent.FLAG_ACTIVITY_FORWARD_RESULT中设置标志Intent并调用startActvity()请勿调用{{ 1}} 。正在启动的startActivityForResult()必须随后调用Activity并返回结果,数据将传递回您的应用程序。您基本上是在“转发”请求从setResult()到下一个Activity的结果。由于在获得结果之前您似乎要进行几项活动,因此您可以继续将责任从一个Activity转发到下一个Activity然后,链中的最后一个应调用setResult(),这些结果将通过onActivityResult()传递回您的应用。

  1. 束缚startActivityForResult()电话:

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

  1. starActivityForResult()将结果传递到Activity needs to pass the results back using

这是您已经尝试实施的解决方案。 LastActivity直接将结果返回到ItemSelectionActivity。但是,您的实现已损坏。 请勿使用LastActivity完成此操作! ItemSelectionActivity有很多副作用,它们会破坏任务中的TaskStackBuilder堆栈。您要执行的操作是:

TaskStackBuilder

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

使用此解决方案,结果将传递到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() 。您将需要覆盖ReceiverActivity,从传递的onNewIntent()获取结果,然后调用onNewIntent(),并将结果传递回您的应用程序。