首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打开多个内部意图的应用程序并等待结果

打开多个内部意图的应用程序并等待结果
EN

Stack Overflow用户
提问于 2019-02-13 12:20:22
回答 1查看 381关注 0票数 1

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

代码语言:javascript
运行
复制
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内部的导航如下:

代码语言:javascript
运行
复制
ReceiverActivity - Step1Activity - Step2Activity - LastActivity

我尝试过设置结果并完成LastActivity,但是它不起作用。finishAffinityfinishAndRemoveTasks也试过了,但它们也不起作用。

然后,我从LastActivity调用LastActivity并设置结果并完成它。但这让我在主屏幕上,结果不会到达APP1。

代码语言:javascript
运行
复制
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堆栈中,这可能就是为什么应用程序会转到主屏幕。

任何帮助都将不胜感激。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-13 17:26:21

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

如果ItemSelectionActivity需要启动其他活动,然后才能将结果发送回您的应用程序,您可以通过几种可能的方式这样做:

  1. FLAG_ACTIVITY_FORWARD_RESULT 使用

ItemSelectionActivity启动另一个Activity时,它应该在Intent中设置标志Intent.FLAG_ACTIVITY_FORWARD_RESULT并调用startActvity() (不调用startActvity())。启动的Activity必须用结果调用setResult(),数据将被传回给应用程序。您基本上是在将对结果的请求从一个Activity“转发”到另一个。由于在得到结果之前,您似乎需要进行多个活动,所以您可以继续将责任从一个Activity转发到下一个Activity。链中的最后一个应该调用setResult(),这些结果将被传递回onActivityResult()中的应用程序。

  1. startActivityForResult() calls:

ItemSelectionActivity启动另一个Activity时,它应该调用startActvityForResult()。正在启动的Activity必须使用结果调用setResult(),并且数据将被传递回onActivityResult()中的ItemSelefctionActivity。然后,ItemSelectionActivity本身应该用数据和finish()调用setResult()。结果将传回给你的应用程序。由于在得到结果之前,您似乎需要进行几个活动,所以可以继续链接这些调用,以便每个Activity使用starActivityForResult()和被调用的Activity needs to pass the results back usingsetResult()启动下一个Activity

  1. LastActivity 让将结果交付给 ItemSelectionActivity**:**

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

代码语言:javascript
运行
复制
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()将它们传递回您的应用程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54670070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档