Android开发:如何将onActivityResult结果传递至resultBreakdown类?
嘿,刚接触Android开发就敢上手实践,这习惯超赞!咱们一步步拆解你遇到的onActivityResult结果传递问题,顺便聊聊更现代的替代方案~
先解决核心问题:怎么用get/set把结果传给
resultBreakdown类 你说懂get/set但没掌握,大概率是实例引用或时机不对导致的。先看一个正确的实现示例:
假设你的主Activity里持有resultBreakdown的实例,在onActivityResult拿到结果后,调用set方法传递数据:
// 主Activity代码 public class MainActivity extends AppCompatActivity { // 确保resultBreakdown是全局实例,不要每次用都new新对象 private ResultBreakdown resultBreakdown; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化resultBreakdown实例 resultBreakdown = new ResultBreakdown(); } // 旧API的onActivityResult回调 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 先判断结果有效 if (resultCode == RESULT_OK && requestCode == YOUR_REQUEST_CODE) { // 从返回的Intent中取出数据(这里假设传的是字符串,你根据实际类型改) String resultData = data.getStringExtra("RESULT_KEY"); // 调用set方法把数据传给resultBreakdown resultBreakdown.setResultData(resultData); // 如果需要立刻处理数据,可以调用resultBreakdown里的逻辑方法 resultBreakdown.processResult(); } } // 启动目标Activity的代码(比如按钮点击事件里) public void startTargetActivity(View view) { Intent intent = new Intent(this, TargetActivity.class); startActivityForResult(intent, YOUR_REQUEST_CODE); } } // ResultBreakdown类的实现 public class ResultBreakdown { private String resultData; // Set方法 public void setResultData(String resultData) { this.resultData = resultData; } // Get方法 public String getResultData() { return resultData; } // 处理结果的逻辑方法 public void processResult() { if (resultData != null) { // 这里写你的业务逻辑,比如解析数据、更新UI等 Log.d("Result", "拿到的数据:" + resultData); } } }
你可能踩的坑:
resultBreakdown实例没初始化就调用set方法,导致空指针;- 每次调用都new一个新的
ResultBreakdown对象,之前设置的数据丢失; - 在错误的时机调用get方法(比如还没进入
onActivityResult就取数据),拿到空值。
更优实现方案:用Activity Result API替代
onActivityResult onActivityResult已经被官方废弃了,现在推荐用Activity Result API,它的代码更简洁,逻辑更清晰,还能避免requestCode冲突的问题。
实现步骤:
- 在主Activity里注册一个结果启动器:
public class MainActivity extends AppCompatActivity { private ResultBreakdown resultBreakdown; // 注册结果回调的Launcher private ActivityResultLauncher<Intent> resultLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); resultBreakdown = new ResultBreakdown(); // 初始化Launcher,直接在回调里处理结果 resultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); if (data != null) { String resultData = data.getStringExtra("RESULT_KEY"); resultBreakdown.setResultData(resultData); resultBreakdown.processResult(); } } } ); } // 启动目标Activity的代码 public void startTargetActivity(View view) { Intent intent = new Intent(this, TargetActivity.class); // 用Launcher启动,不用传requestCode resultLauncher.launch(intent); } }
- 目标Activity返回数据的逻辑不变:
// 目标Activity里返回数据的代码 public void sendResult(View view) { Intent intent = new Intent(); intent.putExtra("RESULT_KEY", "这是返回的测试数据"); setResult(RESULT_OK, intent); finish(); }
这个方案的优势:
- 不需要管理requestCode,避免不同功能之间的代码冲突;
- 回调逻辑更集中,可读性更强;
- 支持封装成独立的结果处理类,解耦Activity和业务逻辑;
- 适配Android 12+的权限请求等场景(扩展能力更强)。
如果resultBreakdown是和UI相关的类(比如Fragment、自定义View),还可以把结果传递逻辑直接绑定到对应UI组件的生命周期里,避免内存泄漏哦~
内容的提问来源于stack exchange,提问作者Spdwiz18
相关产品推荐
相关产品推荐

