我有一个应用程序(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调用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的堆栈中,这可能就是该应用进入主屏幕的原因。
任何帮助将不胜感激。
谢谢。
答案 0 :(得分:1)
您的应用使用ItemSelectionActivity
启动startActivityForResult()
。 onActivityResult()
完成后,您的应用将获得回调ItemSelectionActivity
。它将收到ItemSelectionActivity
调用setResult()
时设置的结果。
如果ItemSelectionActivity
需要先启动其他活动,然后才能将结果发送回您的应用程序,则可以通过以下几种可能的方式进行操作:
FLAG_ACTIVITY_FORWARD_RESULT
ItemSelectionActivity
启动另一个Activity
时,应在Intent.FLAG_ACTIVITY_FORWARD_RESULT
中设置标志Intent
并调用startActvity()
(请勿调用{{ 1}} 。正在启动的startActivityForResult()
必须随后调用Activity
并返回结果,数据将传递回您的应用程序。您基本上是在“转发”请求从setResult()
到下一个Activity
的结果。由于在获得结果之前您似乎要进行几项活动,因此您可以继续将责任从一个Activity
转发到下一个Activity
然后,链中的最后一个应调用setResult()
,这些结果将通过onActivityResult()
传递回您的应用。
startActivityForResult()
电话: 当ItemSelectionActivity
启动另一个Activity
时,它应该调用startActvityForResult()
。然后,正在启动的Activity
必须用结果调用setResult()
,并且数据将被传递回ItemSelefctionActivity
中的onActivityResult()
。 ItemSelectionActivity
然后应该自己使用数据和setResult()
来调用finish()
。结果将传递回您的应用程序。由于在获得结果之前您似乎需要完成一些活动,因此可以继续链接这些调用,以便每个Activity
使用Activity
和被调用的{{ 1}} setResult()`。
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()
,并将结果传递回您的应用程序。