三三要成为安卓糕手
问题:不同的Activity之间怎么进行数据传输呢?
比如第一个页面中有一些字符串数据之类的要通过数据传输,传递给第二个页面进行显示的
在定义一个按钮,和一个文本输入框
<Button
android:id="@+id/btn_second3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="携带数据,跳转到Second页面"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_second2"/>
<EditText
android:id="@+id/et_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入一些数据"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_second3"/> findViewById(R.id.btn_second3).setOnClickListener(this);
etData = findViewById(R.id.et_data);继续在onClick方法中写一个else if()
else if (id == R.id.btn_second3) {
Intent intent = new Intent(this, SecondActivity.class);
String string = etData.getText().toString();
if(string != null && string.length() > 0){
intent.putExtra("key_data",string);
}
startActivity(intent);
}Extra翻译为额外;它的作用是在通过 Intent 启动另一个组件(如 Activity)时,携带一些额外的数据
有点Cookie和Session会话的味道了,记住这里的key值一定要匹配
从输入框中获取string字符串
xml布局自己定义一个TextView,此处略
Intent intent = getIntent();
String keyData = intent.getStringExtra("key_data");
TextView textView = findViewById(R.id.text_view);
if(keyData != null && keyData.length() > 0){
textView.setText(keyData);
}这边呢接收数据,并让string显示在页面上
看一下两者联系

效果就这样,第二个页面(右图)接受到了,就显示出来

问题:MainActivity怎么接收SecondActivity回传的数据
<Button
android:id="@+id/btn_second4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="跳转到Second页面,等待Second返回数据"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/et_data"/> findViewById(R.id.btn_second4).setOnClickListener(this); else if (id == R.id.btn_second4) {
//老方式
startActivityForResult(new Intent(this, SecondActivity.class),9);
}Intent 里用 putExtra 携带数据传给目标页面。@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 9 && resultCode == 8){
int keyComeBackNum = data.getIntExtra("key_comeBackNum", 0);
String keyComeBackString = data.getStringExtra("key_comeBackString");
Log.i(TAG, "onActivityResult: num = " + keyComeBackNum);
Log.i(TAG, "onActivityResult: string = " + keyComeBackString);
etData.setText(keyComeBackNum + keyComeBackString);
}
}requestCode:“请求码”,自己定义的一个整数标记,这里是9; 区分 “是哪一次启动 Activity 的请求”
startActivityForResult 跳转到不同页面,靠 requestCode 就知道 “这次返回的数据,对应之前哪个按钮的跳转” 。resultCode:“结果码”,是目标 Activity 返回的状态标记
data:一个 Intent 对象,是目标 Activity 返回的 “数据载体”; 记得判空
在SecondActivity的xml中在定义一个Button控件
<Button
android:id="@+id/btn_back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="往MainActivity回传数据"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/> findViewById(R.id.btn_back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int comeBack = 798;
String string = "surprise ma da faker";
Intent backIntent = new Intent();
backIntent.putExtra("key_comeBackNum",comeBack);
backIntent.putExtra("key_comeBackString",string);
setResult(8,backIntent);
finish();
}
});startActivityForResult(intent, 9) 启动 SecondActivity,这里的 9 就是 requestCode(请求码)。SecondActivity 中,需要通过 setResult(8, data) 来设置返回结果:
8 就是 resultCode(结果码,自定义的标记)data 是 Intent 对象,通过 putExtra 存入数据(key_comeBackNum 和 key_comeBackString)onActivityResult 方法:
requestCode == 9 判断:“这是之前用请求码 9 启动的页面返回的结果”resultCode == 8 判断:“目标页面返回了结果码 8 的状态”data 中取出携带的 key_comeBackNum 和 key_comeBackString,并更新到 etData 输入框中提问:在第二个页面做了一些数据后,不马上finish,而是手动关闭,这个时候回传的数据还能收到吗
最后一句代码finish删掉;finish的作用就是,点击btn_bakc2这个按钮后activity_second这个页面就退出了

这里我们点击返回按钮,同样MainActivity能接收到传回来的数据,并不受影响


用于启动目标 Activity 并等待其返回结果的核心方法。它的作用类似于传统的 startActivityForResult()
创建点击事情的准备工作


//跳转到第二个页面,等待回传数据
else if (id == R.id.btn_second5) {
activityResultLancher.launch(new Intent(this, SecondActivity.class));
}registerForActivityResult可以理解一个接收Activity结果的注册器,负责 “结果回调”,能在当前 Activity中优雅接收、处理返回的数据。
是传统的startActivityForResult + onActivityResult 机制的平替
private ActivityResultLauncher<Intent> activityResultLancher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult o) {
int resultCode = o.getResultCode();//返回的结果码
Intent data = o.getData();//返回的数据
if (resultCode == 8) {
int keyComeBackNum = data.getIntExtra("key_comeBackNum", 0);
String keyComeBackString = data.getStringExtra("key_comeBackString");
Log.i(TAG, "onActivityResult: key_comeBackNum = " + keyComeBackNum);
Log.i(TAG, "onActivityResult: key_comeBackString" + keyComeBackString);
etData.setText("接受到的数据是" + keyComeBackString + keyComeBackNum);
}
}
}
);作用:启动一个 Activity 并获取其返回结果
ActivityResultContracts 是一个包含多种预定义合约(Contract)的工具类,StartActivityForResult 是其中一个静态内部类

作用:回调接口,当被启动的 Activity 关闭并返回结果时触发
重写onActivityResult方法,((20250808114147-zw40xjr “前面我们已经使用过这个方法,但是两者形参不同,”))ActivityResult中包括结果码(resultCode) 和 返回的数据(data)
