我有一个应用程序(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,但是它不起作用。finishAffinity和finishAndRemoveTasks也试过了,但它们也不起作用。
然后,我从LastActivity调用LastActivity并设置结果并完成它。但这让我在主屏幕上,结果不会到达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()我读了一些其他的答案,有人写到,APP1的活动将被添加到APP2堆栈中,这可能就是为什么应用程序会转到主屏幕。
任何帮助都将不胜感激。
谢谢。
发布于 2019-02-13 17:26:21
您的应用程序使用ItemSelectionActivity启动startActivityForResult()。当onActivityResult()完成时,您的应用程序将得到回调ItemSelectionActivity。它将在调用ItemSelectionActivity时接收setResult()设置的结果。
如果ItemSelectionActivity需要启动其他活动,然后才能将结果发送回您的应用程序,您可以通过几种可能的方式这样做:
FLAG_ACTIVITY_FORWARD_RESULT 使用当ItemSelectionActivity启动另一个Activity时,它应该在Intent中设置标志Intent.FLAG_ACTIVITY_FORWARD_RESULT并调用startActvity() (不调用startActvity())。启动的Activity必须用结果调用setResult(),数据将被传回给应用程序。您基本上是在将对结果的请求从一个Activity“转发”到另一个。由于在得到结果之前,您似乎需要进行多个活动,所以您可以继续将责任从一个Activity转发到下一个Activity。链中的最后一个应该调用setResult(),这些结果将被传递回onActivityResult()中的应用程序。
startActivityForResult() calls:当ItemSelectionActivity启动另一个Activity时,它应该调用startActvityForResult()。正在启动的Activity必须使用结果调用setResult(),并且数据将被传递回onActivityResult()中的ItemSelefctionActivity。然后,ItemSelectionActivity本身应该用数据和finish()调用setResult()。结果将传回给你的应用程序。由于在得到结果之前,您似乎需要进行几个活动,所以可以继续链接这些调用,以便每个Activity使用starActivityForResult()和被调用的Activity needs to pass the results back usingsetResult()启动下一个Activity。
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%正确的,但希望您能理解。
有了这个解决方案,结果将交付给ReceiverActivity中的onNewIntent()。您将需要重写onNewIntent(),从传递的Intent获取结果,然后用结果调用setResult()将它们传递回您的应用程序。
https://stackoverflow.com/questions/54670070
复制相似问题