Android Kotlin 无法从另一个活动中获取结果

Posted

技术标签:

【中文标题】Android Kotlin 无法从另一个活动中获取结果【英文标题】:Android Kotlin not able to get result from another activity 【发布时间】:2021-10-11 03:41:57 【问题描述】:

我需要从我的主要活动开始一个活动,第二个活动必须进行 REST 调用(我正在使用 OkHttp)并将结果返回给主要活动。我实际上能够完成所有过程,但是当我回到主要活动时,我无法获得结果数据。代码如下:

class MainActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult())  result: ActivityResult ->
            val data: Intent? = result.data
            Log.d("Main", data.toString())
        

        findViewById<Button>(R.id.button).setOnClickListener 

            val intent = Intent(this, SecondActivity::class.java)
            resultLauncher.launch(intent)
        
    

class SecondActivity : AppCompatActivity() 
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.second_activity)
            
        customFunction(this)
    
    
    private fun customFunction(activity: Activity) 
        var json: String? = ""

        val payload = "custom payload"

        val okHttpClient = OkHttpClient()
        val requestBody = payload.toRequestBody()
        val request = Request.Builder()
            .header("Authorization", "Basic mytoken")
            .header("Content-Type", "application/x-www-form-urlencoded")
            .url("myurl")
            .method("POST", requestBody)
            .build()

        okHttpClient.newCall(request).enqueue(object : Callback 
            override fun onFailure(call: Call, e: IOException) 
                Log.d("SecondActivity", "onFailure")
                activity.finish()
            

            override fun onResponse(call: Call, response: Response) 
                json = response.body?.string()
                Log.d("SecondActivity", "$json")

                val data = Intent()
                data.putExtra("json", json)
                Log.d("SecondActivity", data.toString())
                activity.setResult(Activity.RESULT_OK, data)
                activity.finish()
            
        )
    

所以,在customFunction() 中,我能够获取该json 并将其放入数据意图中。事实上,当我用Log.d() 打印它时,它会显示Intent (has extras) ,所以没关系。但是当我在 registerForActivityResult 的 MainActivity 中收到它时,它会打印出 null。我做错了什么?

【问题讨论】:

【参考方案1】:

在这种情况下,您必须在MainActivity 的启动器活动中获得额外的Intent,即

而不是

var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult())  result: ActivityResult ->
            val data: Intent? = result.data
            Log.d("Main", data.toString())
        

使用

var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult())  result: ActivityResult ->
            val data: Intent? = result.data
            val actualExtraData = data.getExtra("json") // Here is your actual data 
            Log.d("Main", data.toString())
        

【讨论】:

我尝试使用 val actualExtraData = data?.extras?.get("json")Log.d("Main", actualExtraData .toString()) 但仍然为空 如果我直接打印result,我会得到ActivityResultresultCode=RESULT_CANCELED, data=null 也许响应没有被正确序列化 如何解决?【参考方案2】:

SecondActivity 中,您正在使用方法 putExtra 并将值 json 作为 String 传递。所以在 MainActivity 中得到它

val data = result.data?.getStringExtra("json")

var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult())  result: ActivityResult ->
       // val data: Intent? = result.data
        val data = result.data?.getStringExtra("json")
        Log.d("Main", data.toString())
    

【讨论】:

仍然是null。如上一条评论所述,如果我直接打印result,我会得到ActivityResultresultCode=RESULT_CANCELED, data=null json = response.body()?.string() 检查这一行你的方法,是body?好的?还是body()? 如果我在第二个活动中打印json,我可以看到实际的 json 对象。因此,当我回到主要活动时,就会出现问题。 setResult() 方法似乎无法正常工作或根本无法正常工作。 您使用的是 android:launchMode singleTask 还是 singleInstance ,请检查您的清单文件。 我的清单文件中没有android:launchMode

以上是关于Android Kotlin 无法从另一个活动中获取结果的主要内容,如果未能解决你的问题,请参考以下文章

从另一个提供循环依赖的模块打开活动

如何在 Kotlin 中创建一个打开新活动(Android Studio)的按钮?

无法在带有 Kotlin 的 Android 中使用 Autodispose

Android:从另一个活动中注销 Facebook

Firebase isEmailVerified 无法正常工作 kotlin android

Android/Kotlin:将不同的活动“特征”组合成一个活动