MainActivity与RecActivity之间的双向数据传递详解
文章目录
- MainActivity与RecActivity之间的双向数据传递详解
- 1. 从MainActivity向RecActivity传递数据
- 1.1 基本数据传递方式
- 1.2 接收数据 - RecActivity.java
- 2. 从RecActivity返回数据给MainActivity
- 2.1 返回数据 - RecActivity.java
- 2.2 接收返回数据 - MainActivity.java
- 3. 完整流程说明
- 4. 高级用法和注意事项
- 4.1 使用Bundle传递复杂数据
- 4.2 处理Activity被系统销毁的情况
- 4.3 使用ViewModel共享数据(推荐)
- 5. 常见问题解决方案
- 5.1 数据未传递成功
- 5.2 onActivityResult未被调用
- 5.3 传递大对象导致性能问题
- 6. 完整示例代码结构
MainActivity与RecActivity之间的双向数据传递详解
下面我将详细介绍如何从MainActivity向RecActivity传递数据,以及如何从RecActivity返回数据给MainActivity的完整流程。
1. 从MainActivity向RecActivity传递数据
1.1 基本数据传递方式
MainActivity.java
public class MainActivity extends AppCompatActivity {private static final int REQUEST_CODE = 1001; // 请求码,用于识别返回结果@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button sendButton = findViewById(R.id.send_button);sendButton.setOnClickListener(v -> {// 创建Intent并传递数据Intent intent = new Intent(MainActivity.this, RecActivity.class);// 传递基本数据类型intent.putExtra("message", "Hello from MainActivity");intent.putExtra("number", 42);// 传递Parcelable对象User user = new User("张三", 25);intent.putExtra("user", user);// 启动Activity并期待返回结果startActivityForResult(intent, REQUEST_CODE);});}
}
1.2 接收数据 - RecActivity.java
public class RecActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_rec);// 接收来自MainActivity的数据Intent intent = getIntent();String message = intent.getStringExtra("message");int number = intent.getIntExtra("number", 0);User user = intent.getParcelableExtra("user");// 显示接收到的数据TextView receivedDataView = findViewById(R.id.received_data);receivedDataView.setText(String.format("收到数据:\n消息: %s\n数字: %d\n用户: %s, %d岁",message, number, user != null ? user.getName() : "无", user != null ? user.getAge() : 0));}
}
2. 从RecActivity返回数据给MainActivity
2.1 返回数据 - RecActivity.java
public class RecActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_rec);Button returnButton = findViewById(R.id.return_button);returnButton.setOnClickListener(v -> {// 创建返回的IntentIntent resultIntent = new Intent();// 添加返回数据resultIntent.putExtra("result_message", "Hello back from RecActivity");resultIntent.putExtra("result_number", 100);// 添加Parcelable对象User modifiedUser = new User("李四", 30);resultIntent.putExtra("result_user", modifiedUser);// 设置结果并结束ActivitysetResult(RESULT_OK, resultIntent);finish(); // 关闭当前Activity,返回MainActivity});}
}
2.2 接收返回数据 - MainActivity.java
public class MainActivity extends AppCompatActivity {// ... 之前的代码 ...@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);// 检查请求码和结果码if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {// 获取返回的数据String resultMessage = data.getStringExtra("result_message");int resultNumber = data.getIntExtra("result_number", 0);User resultUser = data.getParcelableExtra("result_user");// 显示返回的数据TextView resultView = findViewById(R.id.result_view);resultView.setText(String.format("返回数据:\n消息: %s\n数字: %d\n用户: %s, %d岁",resultMessage, resultNumber,resultUser != null ? resultUser.getName() : "无",resultUser != null ? resultUser.getAge() : 0));} else if (resultCode == RESULT_CANCELED) {Toast.makeText(this, "用户取消了操作", Toast.LENGTH_SHORT).show();}}
}
3. 完整流程说明
-
MainActivity启动RecActivity:
- 使用
startActivityForResult()
方法启动 - 通过Intent的
putExtra()
方法传递数据
- 使用
-
RecActivity接收数据:
- 通过
getIntent()
获取Intent对象 - 使用对应的
getXxxExtra()
方法获取数据
- 通过
-
RecActivity返回数据:
- 创建新的Intent用于返回数据
- 使用
setResult()
设置返回码和返回Intent - 调用
finish()
关闭Activity
-
MainActivity接收返回数据:
- 重写
onActivityResult()
方法 - 检查
requestCode
和resultCode
- 从返回的Intent中获取数据
- 重写
4. 高级用法和注意事项
4.1 使用Bundle传递复杂数据
MainActivity发送:
Bundle bundle = new Bundle();
bundle.putString("key1", "value1");
bundle.putInt("key2", 123);
intent.putExtra("data_bundle", bundle);
RecActivity接收:
Bundle receivedBundle = getIntent().getBundleExtra("data_bundle");
if (receivedBundle != null) {String value1 = receivedBundle.getString("key1");int value2 = receivedBundle.getInt("key2");
}
4.2 处理Activity被系统销毁的情况
当系统可能销毁并重建Activity时,应使用onSaveInstanceState()
保存状态:
MainActivity.java
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);// 保存必要数据outState.putString("saved_message", "临时保存的数据");
}
4.3 使用ViewModel共享数据(推荐)
对于更复杂的数据共享,可以考虑使用ViewModel:
- 添加ViewModel依赖:
implementation "androidx.lifecycle:lifecycle-viewmodel:2.4.0"
- 创建共享ViewModel:
public class SharedViewModel extends ViewModel {private final MutableLiveData<String> sharedData = new MutableLiveData<>();public void setData(String data) {sharedData.setValue(data);}public LiveData<String> getData() {return sharedData;}
}
- 在Activity中使用:
// MainActivity中
SharedViewModel viewModel = new ViewModelProvider(this).get(SharedViewModel.class);
viewModel.setData("要共享的数据");// RecActivity中
SharedViewModel viewModel = new ViewModelProvider(this).get(SharedViewModel.class);
viewModel.getData().observe(this, data -> {// 使用数据更新UI
});
5. 常见问题解决方案
5.1 数据未传递成功
- 检查键名是否一致
- 确保数据类型匹配
- 检查是否有拼写错误
5.2 onActivityResult未被调用
- 确保使用
startActivityForResult()
而不是startActivity()
- 检查请求码是否正确
- 确保RecActivity调用了
setResult()
和finish()
5.3 传递大对象导致性能问题
- 避免直接传递大Bitmap
- 考虑传递URI或文件路径
- 使用全局变量或ViewModel替代
6. 完整示例代码结构
app/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ ├── com.example.myapp/
│ │ │ │ ├── MainActivity.java
│ │ │ │ ├── RecActivity.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── User.java (Parcelable)
│ │ │ │ │ └── SharedViewModel.java
│ │ ├── res/
│ │ │ ├── layout/
│ │ │ │ ├── activity_main.xml
│ │ │ │ └── activity_rec.xml
通过以上完整实现,你可以轻松地在MainActivity和RecActivity之间实现双向数据传递,满足大多数应用场景的需求。