Android笔记【17】返回数据的两种方法

目录

一、问题

二、具体分析

1、代码

2、区别

1. 目的和使用场景

resultLauncher

startActivity

2. 数据传递方式

3. 返回结果的管理

4. 代码示例对比

使用 resultLauncher 启动活动并处理返回结果:

使用 startActivity 启动活动(不处理返回):

总结

3、使用 startActivity 启动活动,也可以返回信息。因为有putExtra

区别总结

示例对比

1. 使用 startActivityForResult 和 onActivityResult(旧方法)

2. 使用 ActivityResult API(新方法)

目标活动返回结果示例

总结


一、问题

【15】【16】中两种处理方法的优劣对比

二、具体分析

1、代码

val intent = Intent(this@SecondActivity, MainActivity::class.java)
intent.putExtra("extra_data", data)
startActivity(intent)
        resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == RESULT_OK) {
                val message = result.data?.getStringExtra("return_message")
                // 处理返回消息,例如显示 Toast 或 Log
            }
        }

2、区别

这两段代码在 Android 中用于处理活动(Activity)间的交互,但它们的功能和实现方式有显著区别。以下是对这两段代码的详细比较:

1. 目的和使用场景

resultLauncher
resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == RESULT_OK) {
        val message = result.data?.getStringExtra("return_message")
        // 处理返回消息,例如显示 Toast 或 Log
    }
}
  • 目的:用于启动一个新活动并接收返回结果。
  • 使用场景:适合于需要从新活动中获取结果的场景。例如,你可能想从一个表单活动中获取用户输入的信息或选择的项。
startActivity
val intent = Intent(this@SecondActivity, MainActivity::class.java)
intent.putExtra("extra_data", data)
startActivity(intent)
  • 目的:用于启动一个新活动,通常不关心返回结果。
  • 使用场景:适合于简单的导航场景,例如从主界面跳转到设置页面,而不需要处理返回的数据。

2. 数据传递方式

  • resultLauncher:使用 ActivityResult API,可以获取新的活动返回的数据。调用 startActivityForResult 时,你可以通过设置 setResult 在新活动中返回数据。

  • startActivity:通过 IntentputExtra 方法将数据传递给目标活动,但不期望从目标活动返回数据。

3. 返回结果的管理

  • resultLauncher:注册后,使用 launch 方法启动新活动,并在回调中处理返回结果。通过 result 对象,你可以检查结果代码和获取返回的数据。

  • startActivity:启动活动后,无法直接获取返回结果,适合于一旦启动就不需要回传的数据场景。

4. 代码示例对比

使用 resultLauncher 启动活动并处理返回结果:
// 注册结果处理器
resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == RESULT_OK) {
        val message = result.data?.getStringExtra("return_message")
        // 处理返回消息
    }
}

// 启动活动
val intent = Intent(this, SecondActivity::class.java)
resultLauncher.launch(intent)
使用 startActivity 启动活动(不处理返回):
// 创建意图并传递数据
val intent = Intent(this, MainActivity::class.java)
intent.putExtra("extra_data", data)
startActivity(intent) // 启动活动

总结

  • resultLauncher 是用于启动活动并处理返回结果的现代方法,适合需要获取新活动返回信息的情况。
  • startActivity 是传统的启动活动方法,适合于不需要接收返回结果的简单导航。

选择使用哪种方法取决于你的具体需求:是否需要从新活动中获取结果,以及如何管理活动间的数据传递。

3、使用 startActivity 启动活动,也可以返回信息。因为有putExtra

通过 startActivity 启动活动时,确实可以使用 putExtra 传递数据到目标活动,这样目标活动可以使用 getIntent().getStringExtra() 等方法接收这些数据。然而,这与获取返回信息的方式有所不同。

区别总结

  1. 数据传递

    • putExtra:用于在启动活动时传递数据到目标活动。调用 putExtra 是在启动活动之前设置数据,目标活动可以通过 getIntent().getStringExtra() 等方法获取这些数据。
    • 返回结果:在目标活动中,可以通过 setResult() 方法设置返回结果,然后调用 finish() 来结束活动。在这种情况下,原活动可以使用 onActivityResult 方法来接收返回数据。
  2. 获取返回结果

    • startActivityForResult (旧方法):在启动活动时使用 startActivityForResult(intent, requestCode),然后在原活动中重写 onActivityResult 来处理返回的数据。
    • ActivityResult API (新方法):使用 registerForActivityResultActivityResultContracts,更简洁地处理返回结果。

示例对比

1. 使用 startActivityForResultonActivityResult(旧方法)
val intent = Intent(this, SecondActivity::class.java)
startActivityForResult(intent, REQUEST_CODE)

在原活动中处理返回结果:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        val message = data?.getStringExtra("return_message")
        // 处理返回消息
    }
}
2. 使用 ActivityResult API(新方法)

启动活动的原活动:

val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == RESULT_OK) {
        val message = result.data?.getStringExtra("return_message")
        // 处理返回消息
    }
}

// 启动活动
val intent = Intent(this, SecondActivity::class.java)
resultLauncher.launch(intent)

目标活动返回结果示例

在目标活动中,你可以通过 setResult() 返回数据:

val returnIntent = Intent()
returnIntent.putExtra("return_message", "Hello from SecondActivity")
setResult(RESULT_OK, returnIntent)
finish() // 结束活动

总结

  • putExtra 主要用于在启动活动时传递数据到目标活动。
  • 返回结果 则需要使用 setResult() 和适当的方法来处理返回的数据。startActivity 本身并不处理返回结果,而是需要结合 onActivityResult 或新的 ActivityResult API 来实现。

因此,虽然可以在 startActivity 中传递数据,但实际获取返回结果的方式和机制是不同的。选择合适的方法取决于你的具体需求和代码结构。

你可能感兴趣的:(Android开发,android,笔记)