来自子活动的setResult(Activity.RESULT_OK,returnedIntent)总是向我返回一个Activity.CANCELED到主要活动

时间:2019-03-06 23:53:52

标签: android android-intent kotlin

我想将一些数据从孩子的活动ActivityChild返回到我的主要活动ActivityMain

我首先以这种方式从ActivityChildActivityMain

val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivityForResult(intent, 1)
// Actually, this code first launch chrome, then when the user identify on
// chrome, the redirect_uri calls the ActivityChild

然后,我以这种方式将数据从ActivityChild返回到ActivityMain

val data: Uri? = intent.data
val returnedIntent = Intent();
returnedIntent.putExtra("code", data!!.getQueryParameter("code"))
setResult(Activity.RESULT_OK, returnedIntent)
finish()

最后,我在ActivityMain中使用onActivityResult的重写捕获了数据:

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == 1) {
        if (resultCode == Activity.RESULT_OK) {
            val returnedValue = data!!.getStringExtra("data")
        }
        else if (resultCode == Activity.RESULT_CANCELED)
            Log.d("mDebug", "Couldn't retrieve data") // Always enters here
        else
            Log.d("mDebug", "final")
    }
}

它一直处于Activity.RESULT_CANCELED状态。如果可以解决,我将无法解决。

我认为原因是因为我首先通过意图启动了chrome,并且无法以某种方式将数据传输到ActivityMain。我远远没有涉及意图的所有内容,而且我可能在这里遗漏了一些东西,所以如果有人可以帮助我并解释一下!

2 个答案:

答案 0 :(得分:0)

您可以考虑将此标志FLAG_ACTIVITY_FORWARD_RESULT添加到您的returnedIntent中。 https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_FORWARD_RESULT

  

如果已设置并且此意图用于从现有活动启动新活动,则现有活动的回复目标将转移到新活动。这样,新活动可以调用Activity.setResult(int)并将结果发送回原始活动的回复目标。

答案 1 :(得分:0)

因此,感谢@Bach Vu和本文:Intent.FLAG_ACTIVITY_FORWARD_RESULT and PendingIntent,我设法通过共享首选项获得了想要的东西。我将数据存储在ActivityChild中的共享首选项中,并使用onActivityResult的覆盖在ActivityMain中进行检索