Android Activity进行数据传输的方法
作者:三三是该溜子
Android 应用开发中,Activity之间的数据传递是常见的需求。核心方法包括使用Intent、Bundle、使用全局变量存储、SharedPreferences以及通过数据库进行数据传递。其中,使用Intent和Bundle进行数据传递是最常见且高效的方法。Intent不仅可以启动不同的Activity,还能够携带各种数据。通过putExtra()方法添加数据,在新的Activity中通过getIntent()方法接收数据,实现不同Activity间的数据传递。
一:Activity之间的数据传输
问题:不同的Activity之间怎么进行数据传输呢?
比如第一个页面中有一些字符串数据之类的要通过数据传输,传递给第二个页面进行显示的
1:MainActivity做处理
在定义一个按钮,和一个文本输入框
<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); }
(1)putExtra
Extra
翻译为额外;它的作用是在通过 Intent 启动另一个组件(如 Activity)时,携带一些额外的数据
有点Cookie和Session会话的味道了,记住这里的key值一定要匹配
(2)逻辑梳理
从输入框中获取string字符串
2:SecondActivity做处理
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显示在页面上
看一下两者联系
3:效果
效果就这样,第二个页面(右图)接受到了,就显示出来
二:Activity之间的数据回传
问题:MainActivity怎么接收SecondActivity回传的数据
1:MainActivity做处理
(1)startActivityForResult
<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); }
- startActivityForResult方法在安卓API30以后已经过时了,但是很多商业中也会用到这个玩意,也得学bro
- 参数一:Intent 对象,“要启动哪个页面”,也可以在
Intent
里用putExtra
携带数据传给目标页面。 - 参数二:requestCode(请求码),给这次跳转打个 “标记 9”,等目标页面返回数据时,能通过这个标记识别 “这是 btn_start_second4 按钮跳转的返回”。
- 参数一:Intent 对象,“要启动哪个页面”,也可以在
(2)onActivityResult
@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 返回的 “数据载体”; 记得判空- getInExtra取到的值如果为空,默认为0
2:SecondActivity做处理
在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"/>
(1)setResult
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(); } });
- setResult(8,backIntent),这里我们的结果码就是8
3:逻辑梳理
- 启动时:
- 通过
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
输入框中
- 通过
4:finish问题延伸
提问:在第二个页面做了一些数据后,不马上finish,而是手动关闭,这个时候回传的数据还能收到吗
最后一句代码finish删掉;finish的作用就是,点击btn_bakc2这个按钮后activity_second
这个页面就退出了
这里我们点击返回按钮,同样MainActivity能接收到传回来的数据,并不受影响
三:Activity数据回传的新方式
1:.launch
用于启动目标 Activity 并等待其返回结果的核心方法。它的作用类似于传统的 startActivityForResult()
创建点击事情的准备工作
//跳转到第二个页面,等待回传数据 else if (id == R.id.btn_second5) { activityResultLancher.launch(new Intent(this, SecondActivity.class)); }
2: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); } } } );
(1)new ActivityResultContracts.StartActivityForResult()
作用:启动一个 Activity 并获取其返回结果
ActivityResultContracts
是一个包含多种预定义合约(Contract)的工具类,StartActivityForResult
是其中一个静态内部类
(2)new ActivityResultCallback()
作用:回调接口,当被启动的 Activity 关闭并返回结果时触发
重写onActivityResult方法,((20250808114147-zw40xjr “前面我们已经使用过这个方法,但是两者形参不同,”))ActivityResult
中包括结果码(resultCode) 和 返回的数据(data)
(3)o.getResultCode()
(4)o.getdata()
3:结果
到此这篇关于Android Activity 如何进行数据传输的文章就介绍到这了,更多相关Android Activity 数据传输内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!