Android startActivityForResult 过时的替代方法。registerForActivityResult用法

本文介绍了在Android中如何使用registerForActivityResult作为startActivityForResult的替代方法。通过示例展示了在A_Activity和B_Activity之间如何进行数据传递,并且提供了DateUtility类用于格式化当前时间。

从A_Activity跳转到B_Activity,用Intent传递数据,B页面处理完返回数据到A

activity_a.xml

<?xml version="1.0" encoding="utf-8"?>

<Button
    android:id="@+id/button_to_b"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="向B页面发送数据"/>
<TextView
    android:id="@+id/textview_from_b"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="30sp"/>

activity_b.xml

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/textview_from_a"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="这是第二页"
    android:textSize="30sp"/>
<Button
    android:id="@+id/button_to_a"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="返回应答数据"/>

DateUtility.java

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateUtility {
public static String getNowTimeZH() {
//xxxx年

<think>好的,我现在需要帮助用户解决AndroidstartActivityForResult过时替代方案问题。用户已经提供了一些相关的引用资料,我需要先仔细阅读这些内容,理解新的方法是如何工作的。 首先,用户提到的替代方案是使用registerForActivityResult和ActivityResultContracts。根据引用[2]和[3],新的方法需要在Activity或Fragment中注册一个结果处理器,然后通过launch方法启动新的Activity。这看起来和之前的startActivityForResult不同,但功能上是类似的,只是API设计更模块化。 接下来,我需要确认步骤是否正确。根据引用[5],在FirstActivity中,用户创建了一个ActivityResultLauncher实例,并在点击事件中使用它来启动另一个Activity。然后在回调中处理返回的数据。这个过程应该是正确的,但需要确保registerForActivityResult在onCreate或onStart等生命周期方法中调用,以避免内存泄漏。 另外,用户可能关心如何处理不同的请求类型,比如拍照或选择文件。引用[3]提到使用ActivityResultContracts.StartActivityForResult(),但还有其他预定义的Contract,比如TakePicture,这可能需要不同的处理方式。这部分可能需要进一步解释,但用户当前的问题可能只需要基本的替代方法。 还要注意,新的API属于AndroidX Activity和Fragment库,所以需要检查依赖是否添加正确。如果用户遇到问题,可能需要确认他们的项目是否使用了最新版本的库。 最后,需要总结步骤,给出示例代码,并确保代码格式正确,符合用户之前的指示。同时生成相关问题,帮助用户深入理解,比如如何处理多个请求或使用其他Contracts。</think>### Android startActivityForResult 替代方案 在 Android 开发中,`startActivityForResult` 已被弃用,官方推荐使用 `registerForActivityResult` + `ActivityResultContracts` 的组合实现更模块化的结果回调机制[^2][^3][^5]。 #### 实现步骤 1. **注册结果监听器** 在 `Activity`/`Fragment` 中通过 `registerForActivityResult` 注册回调: ```kotlin private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data?.getStringExtra("key") // 处理返回数据 } } ``` 2. **启动目标 Activity** 通过 `launcher.launch(intent)` 触发跳转: ```kotlin button.setOnClickListener { val intent = Intent(this, SecondActivity::class.java) launcher.launch(intent) } ``` #### 核心机制 - **ActivityResultContracts**:定义输入/输出类型的契约类,例如: - `StartActivityForResult()`:通用场景[^3] - `TakePicture()`:拍照场景 - `RequestPermission()`:权限请求 - **生命周期安全**:自动管理回调注册与注销,避免内存泄漏[^2][^5] #### 完整示例 ```kotlin class MainActivity : AppCompatActivity() { private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { result.data?.getStringExtra("data")?.let { Toast.makeText(this, it, Toast.LENGTH_SHORT).show() } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById<Button>(R.id.btn_jump).setOnClickListener { val intent = Intent(this, SecondActivity::class.java) resultLauncher.launch(intent) } } } ``` #### 优势对比 | 特性 | 旧方案 | 新方案 | |--------------------|-----------------------|-------------------------------| | 代码耦合度 | 需重写 `onActivityResult` | 独立回调函数 | | 多请求处理 | 需管理 `requestCode` | 多个 Launcher 实例隔离 | | 扩展性 | 低 | 支持自定义 Contract 类型 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值