gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:19:24 26 4
gpt4 key购买 nike

我有一个应用程序 (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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com