Android Activity进行数据传输的方法
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一:Activity之间的数据传输</li><ul class="second_class_ul"><li>1:MainActivity做处理</li><ul class="third_class_ul"><li>(1)putExtra</li><li>(2)逻辑梳理</li></ul><li>2:SecondActivity做处理</li><ul class="third_class_ul"></ul><li>3:效果</li><ul class="third_class_ul"></ul></ul><li>二:Activity之间的数据回传</li><ul class="second_class_ul"><li>1:MainActivity做处理</li><ul class="third_class_ul"><li>(1)startActivityForResult</li><li>(2)onActivityResult</li></ul><li>2:SecondActivity做处理</li><ul class="third_class_ul"><li>(1)setResult</li></ul><li>3:逻辑梳理</li><ul class="third_class_ul"></ul><li>4:finish问题延伸</li><ul class="third_class_ul"></ul></ul><li>三:Activity数据回传的新方式</li><ul class="second_class_ul"><li>1:.launch</li><ul class="third_class_ul"></ul><li>2:registerForActivityResult</li><ul class="third_class_ul"><li>(1)new ActivityResultContracts.StartActivityForResult()</li><li>(2)new ActivityResultCallback()</li><li>(3)o.getResultCode()</li><li>(4)o.getdata()</li></ul><li>3:结果</li><ul class="third_class_ul"></ul></ul></ul></div><p>Android 应用开发中,Activity之间的数据传递是常见的需求。<strong>核心方法包括使用Intent、Bundle、使用全局变量存储、SharedPreferences以及通过数据库进行数据传递</strong>。其中,<strong>使用Intent和Bundle进行数据传递是最常见且高效的方法</strong>。Intent不仅可以启动不同的Activity,还能够携带各种数据。通过putExtra()方法添加数据,在新的Activity中通过getIntent()方法接收数据,实现不同Activity间的数据传递。</p><p class="maodian"></p><h2>一:Activity之间的数据传输</h2>
<p>问题:不同的Activity之间怎么进行数据传输呢?</p>
<p>比如第一个页面中有一些字符串数据之类的要通过数据传输,传递给第二个页面进行显示的</p>
<p class="maodian"></p><p class="maodian"></p><h3>1:MainActivity做处理</h3>
<p>在定义一个按钮,和一个文本输入框</p>
<div class="jb51code"><pre class="brush:java;"><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"/></pre></div>
<div class="jb51code"><pre class="brush:plain;"> findViewById(R.id.btn_second3).setOnClickListener(this);
etData = findViewById(R.id.et_data);
</pre></div>
<p>继续在onClick方法中写一个else if()</p>
<div class="jb51code"><pre class="brush:java;">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);
}</pre></div>
<p class="maodian"></p><h4>(1)putExtra</h4>
<p><code>Extra</code>翻译为额外;它的作用是在通过 Intent 启动另一个组件(如 Activity)时,<strong>携带一些额外的数据</strong></p>
<p>有点Cookie和Session会话的味道了,记住这里的key值一定要匹配</p>
<p class="maodian"></p><h4>(2)逻辑梳理</h4>
<p>从输入框中获取string字符串</p>
<p class="maodian"></p><p class="maodian"></p><h3>2:SecondActivity做处理</h3>
<p>xml布局自己定义一个TextView,此处略</p>
<div class="jb51code"><pre class="brush:java;">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);
}</pre></div>
<p>这边呢接收数据,并让string显示在页面上</p>
<p>看一下两者联系</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025082309083282.png" /></p>
<p class="maodian"></p><h3>3:效果</h3>
<p>效果就这样,第二个页面(右图)接受到了,就显示出来</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025082309083254.png" /></p>
<p class="maodian"></p><h2>二:Activity之间的数据回传</h2>
<p>问题:MainActivity怎么接收SecondActivity回传的数据</p>
<h3>1:MainActivity做处理</h3>
<p class="maodian"></p><h4>(1)startActivityForResult</h4>
<div class="jb51code"><pre class="brush:java;"><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"/></pre></div>
<div class="jb51code"><pre class="brush:java;">findViewById(R.id.btn_second4).setOnClickListener(this);</pre></div>
<div class="jb51code"><pre class="brush:java;">else if (id == R.id.btn_second4) {
//老方式
startActivityForResult(new Intent(this, SecondActivity.class),9);
}</pre></div>
<ul><li>startActivityForResult方法在安卓API30以后已经过时了,但是很多商业中也会用到这个玩意,也得学bro<ul><li>参数一:Intent 对象,“要启动哪个页面”,也可以在 <code>Intent</code> 里用 <code>putExtra</code> 携带数据传给目标页面。</li><li>参数二:requestCode(请求码),给这次跳转打个 “标记 9”,等目标页面返回数据时,能通过这个标记识别 “这是 btn_start_second4 按钮跳转的返回”。</li></ul></li></ul>
<p class="maodian"></p><h4>(2)onActivityResult</h4>
<div class="jb51code"><pre class="brush:java;">@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);
}
}</pre></div>
<ul><li><code>requestCode</code>:“请求码”,自己定义的一个<strong>整数标记,这里是9;</strong> 区分 “是哪一次启动 Activity 的请求”
<ul><li>比如:一个页面有多个按钮,都用 <code>startActivityForResult</code> 跳转到不同页面,靠 <code>requestCode</code> 就知道 “这次返回的数据,对应之前哪个按钮的跳转” 。</li></ul></li><li><code>resultCode</code>:“结果码”,是<strong>目标 Activity 返回的状态标记</strong></li><li><code>data</code>:一个 <code>Intent</code> 对象,是<strong>目标 Activity 返回的 “数据载体”;</strong> 记得判空<ul><li>getInExtra取到的值如果为空,默认为0</li></ul></li></ul>
<h3>2:SecondActivity做处理</h3>
<p>在SecondActivity的xml中在定义一个Button控件</p>
<div class="jb51code"><pre class="brush:java;"><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"/></pre></div>
<p class="maodian"></p><h4>(1)setResult</h4>
<div class="jb51code"><pre class="brush:java;">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();
}
});</pre></div>
<ul><li>setResult(8,backIntent),这里我们的结果码就是8</li></ul>
<p class="maodian"></p><h3>3:逻辑梳理</h3>
<ul><li><strong>启动时</strong>:
<ul><li>通过 <code>startActivityForResult(intent, 9)</code> 启动 <code>SecondActivity</code>,这里的 <code>9</code> 就是 <code>requestCode</code>(请求码)。</li></ul></li><li><strong>目标页面返回时</strong>:<ul><li>在 <code>SecondActivity</code> 中,需要通过 <code>setResult(8, data)</code> 来设置返回结果:</li><li>第一个参数 <code>8</code> 就是 <code>resultCode</code>(结果码,自定义的标记)</li><li>第二个参数 <code>data</code> 是 <code>Intent</code> 对象,通过 <code>putExtra</code> 存入数据(<code>key_comeBackNum</code> 和 <code>key_comeBackString</code>)</li></ul></li><li><strong>接收返回时</strong>:回到当前页面的 <code>onActivityResult</code> 方法:<ul><li>通过 <code>requestCode == 9</code> 判断:“这是之前用请求码 9 启动的页面返回的结果”</li><li>通过 <code>resultCode == 8</code> 判断:“目标页面返回了结果码 8 的状态”</li><li>从 <code>data</code> 中取出携带的 <code>key_comeBackNum</code> 和 <code>key_comeBackString</code>,并更新到 <code>etData</code> 输入框中</li></ul></li></ul>
<p class="maodian"></p><h3>4:finish问题延伸</h3>
<p>提问:在第二个页面做了一些数据后,不马上finish,而是手动关闭,这个时候回传的数据还能收到吗</p>
<p>最后一句代码finish删掉;finish的作用就是,点击btn_bakc2这个按钮后<code>activity_second</code>这个页面就退出了</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025082309083212.png" /></p>
<p>这里我们点击返回按钮,同样MainActivity能接收到传回来的数据,并不受影响</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025082309083258.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025082309083232.png" /></p>
<p class="maodian"></p><h2>三:Activity数据回传的新方式</h2>
<p class="maodian"></p><h3>1:.launch</h3>
<p>用于<strong>启动目标 Activity 并等待其返回结果</strong>的核心方法。它的作用类似于传统的 <code>startActivityForResult()</code></p>
<p>创建点击事情的准备工作</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025082309083219.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025082309083235.png" /></p>
<div class="jb51code"><pre class="brush:java;">//跳转到第二个页面,等待回传数据
else if (id == R.id.btn_second5) {
activityResultLancher.launch(new Intent(this, SecondActivity.class));
}</pre></div>
<p class="maodian"></p><h3>2:registerForActivityResult</h3>
<p>可以理解一个接收Activity结果的注册器,负责 <strong>“结果回调”,能在当前 Activity中优雅接收、处理返回的数据。</strong></p>
<p>是传统的<code>startActivityForResult</code> + <code>onActivityResult</code> 机制的平替</p>
<div class="jb51code"><pre class="brush:java;">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);
}
}
}
);</pre></div>
<p class="maodian"></p><h4>(1)new ActivityResultContracts.StartActivityForResult()</h4>
<p>作用:启动一个 Activity 并获取其返回结果</p>
<p><code>ActivityResultContracts</code> 是一个包含多种预定义合约(Contract)的工具类,<code>StartActivityForResult</code> 是其中一个静态内部类</p>
<p class="maodian"></p><h4>(2)new ActivityResultCallback()</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025082309083274.png" /></p>
<p>作用:回调接口,当被启动的 Activity 关闭并返回结果时触发</p>
<p>重写onActivityResult方法,((20250808114147-zw40xjr “前面我们已经使用过这个方法,但是两者形参不同,”))<code>ActivityResult</code>中包括<strong>结果码(resultCode)</strong> 和 <strong>返回的数据(data)</strong></p>
<p class="maodian"></p><h4>(3)o.getResultCode()</h4>
<p class="maodian"></p><h4>(4)o.getdata()</h4>
<p class="maodian"></p><h3>3:结果</h3>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025082309083215.jpg" /></p>
<p>到此这篇关于Android Activity 如何进行数据传输的文章就介绍到这了,更多相关Android Activity 数据传输内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>Android使用socket进行二进制流数据传输</li><li>Android数据传输中的参数加密代码示例</li><li>详解Android——蓝牙技术 带你实现终端间数据传输</li><li>Android Activity 入门简介</li><li>Android开发Activity的生命周期详解</li><li>Android中Activity组件实例介绍</li><li>Android四大组件之Activity详细介绍</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]