废弃原因

        主要原因 as follows :
        1、注册版wordPress连rar都不让上传,十分尴尬,劳动成果没有地方放。
        2、WordPress不是专业程序员论坛,高手并不多,看的人就不用提了,少得可怜。
        3、也应该换一个简单、朴素、功能强大(并不是WordPress功能不强)、较专业、环保的blog用下了。
        4、特别喜欢之处在于,对于代码的关键字高亮,javaeye做的很好。I like it!

### 问题分析 在 Android 开发中,`startActivityForResult()` 是一个长期用于从一个 Activity 启动另一个 Activity 并等待其返回结果的方法。然而,在 Android 11(API 30)及更高版本中,`startActivityForResult()` 和 `setResult()` 被标记为废弃[^1]。废弃的主要原因包括: - **生命周期耦合问题**:`startActivityForResult()` 依赖于 `onActivityResult()` 回调方法,而该方法是在 `Activity` 中实现的,导致与 `Fragment` 或 `ViewModel` 等组件的生命周期管理不一致。 - **缺乏模块化**:`onActivityResult()` 方法需要手动处理请求码和结果码,这在复杂的应用中容易引发代码混乱和错误。 - **与现代架构组件不兼容**:`startActivityForResult()` 无法很好地集成到 `ViewModel`、`LiveData` 等现代架构组件中,影响了代码的可维护性和可测试性。 为了解决这些问题,Google 引入了 **Activity Result API**,它通过 `registerForActivityResult()` 和 `ActivityResultLauncher` 提供了一种更加模块化、灵活且类型安全的方式来处理 Activity 之间的结果传递。 --- ### 替代方案:Activity Result API #### 使用 `registerForActivityResult()`(Java 示例) 在 Java 中,可以通过 `ActivityResultLauncher` 来替代 `startActivityForResult()`。以下是一个完整的 Java 示例: ```java public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; private ActivityResultLauncher<Intent> activityResultLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { String data = result.getData().getStringExtra("back_data"); Toast.makeText(this, data, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "获取不到数据", Toast.LENGTH_SHORT).show(); } } ); binding.button01.setOnClickListener(v -> { Intent intent = new Intent(MainActivity.this, SecondActivity.class); activityResultLauncher.launch(intent); }); } } ``` #### 在 `SecondActivity` 中返回数据 ```java public class SecondActivity extends AppCompatActivity { private ActivitySecondBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = ActivitySecondBinding.inflate(getLayoutInflater()); setContentView(mBinding.getRoot()); mBinding.mButton2.setOnClickListener(v -> { String data = "This is data for FirstActivity!"; Intent intent = new Intent(); intent.putExtra("mData", data); setResult(RESULT_OK, intent); finish(); }); } } ``` --- ### 优势与改进 1. **生命周期感知**:`ActivityResultLauncher` 与 `Activity` 和 `Fragment` 的生命周期绑定,避免了手动管理请求码和结果码的复杂性。 2. **模块化设计**:每个 `ActivityResultLauncher` 实例都可以独立处理结果,提高了代码的可读性和可维护性。 3. **兼容性**:Activity Result API 与 Android 的现代架构组件(如 `ViewModel` 和 `LiveData`)无缝集成,支持更清晰的 MVVM 或 MVI 架构设计。 4. **类型安全**:通过 `ActivityResultContracts` 提供的契约,可以确保传递的 Intent 和返回的数据类型一致,减少运行时错误。 --- ### 总结 `startActivityForResult()` 被废弃的核心原因在于其与现代 Android 架构的不兼容性,尤其是在生命周期管理和模块化设计方面存在不足。使用 `registerForActivityResult()` 和 `ActivityResultLauncher` 是推荐的替代方案,它提供了更清晰、更安全的方式来处理 Activity 之间的结果传递,并且能够更好地融入现代 Android 开发实践。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值