【Android】Activity组件通信
文章目录
- 1.使用Intent传递数据
- 2.使用Bundle传递复杂数据
- 3.startActivityForResult 和 onActivityResult
- 4.使用ViewModel共享数据
在Android中,Activity之间的通信是一个常见且重要的任务。以下是一些常用的方法来实现Activity之间的数据传递和通信:
1.使用Intent传递数据
这是最常见的方式,适用于从一个Activity向另一个Activity传递数据。可以通过Intent的putExtra()
方法来附加数据,接收方则通过getIntent().getStringExtra()
等方法来获取数据。
发送数据Activity:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
intent.putExtra("text","成功跳转过来了");
startActivity(intent);
}
});
接受数据Activity:
textView2.setText(getIntent().getStringExtra("text"));
2.使用Bundle传递复杂数据
对于更复杂的数据结构,如对象数组或自定义对象,可以使用Bundle来封装数据并通过Intent传递。
发送数据Activity:
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
Bundle bundle = new Bundle();
bundle.putString("text","使用Bundle成功跳转过来了");
intent.putExtras(bundle);
startActivity(intent);
接受数据Activity:
Bundle bundle = getIntent().getExtras();
if(bundle != null){
String text = bundle.getString("text");
textView2.setText(text);
}else {
textView2.setText("没有数据");
}
3.startActivityForResult 和 onActivityResult
当需要从一个Activity启动另一个Activity,并期望从后者返回结果时,可以使用startActivityForResult()
方法。在目标Activity中,可以通过setResult()
方法设置返回结果,然后调用finish()
结束Activity。原Activity通过重写onActivityResult()
方法来处理返回的结果。
发送请求的Activity:
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
startActivityForResult(intent,REQUEST_CODE);
处理结果的Activity:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == SUCCESS_CODE){
Log.d("ning", "MainActivity2返回成功");
String response_content = data.getStringExtra("response_content");
textView.setText(response_content);
}
}
返回结果的Activity:
Intent intent = new Intent();
intent.putExtra("response_content","这是来自MainActivity2的数据");
setResult(SUCCESS_CODE,intent);
finish();
4.使用ViewModel共享数据
在MVVM架构中,ViewModel可以用来在多个Activity或Fragment之间共享数据。ViewModel的生命周期与Activity或Fragment的生命周期独立,因此它可以保留数据,即使Activity或Fragment被重新创建。
创建ViewModel:
public class MyViewModel extends ViewModel {
private MutableLiveData<String> mText = new MutableLiveData<>();
public MutableLiveData<String> getText() {
return mText;
}
public void setText(String text) {
mText.setValue(text);
}
}
myViewModel.getText().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
textView2.setText(s);
}
});