安卓两个活动之间的消息传输(收到消息后基于应答)
目录
- 前言:
- 基础夯实:
- 效果展示:
- 核心代码:
前言:
安卓中,两个页面进行数据的传输
基础夯实:
一、Intent的概念与用途
Intent是Android中各组件之间信息沟通的桥梁,它用于在不同组件(如Activity、Service、BroadcastReceiver等)之间传递消息。Intent的主要作用是:
标明本次通信请求的来源、目标以及通信方式。
携带本次通信需要的数据内容。
负责让接收方传回应答数据内容给发起方。
二、显式Intent与隐式Intent
Intent可以通过两种方式指定目标活动:显式Intent和隐式Intent。
显式Intent:直接指定来源活动与目标活动,属于精确匹配。在构建一个Intent对象时,需要指定两个参数,第一个参数表示跳转的来源页面(即“来源Activity.this”),第二个参数表示待跳转的页面(即“目标Activity.class”)。
隐式Intent:没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,属于模糊匹配。通常App不希望向外部暴露活动名称,只给出一个事先定义好的字符串,这样大家约定俗成、按图索骥即可。隐式Intent起到了标记过滤作用,这个动作名称标记串可以是自己定义的动作,也可以是已有的系统动作。
三、活动之间的消息传输
发送数据:
在第一个活动中,创建一个Intent对象,并通过putExtra()方法将要发送的数据放入Intent中。
调用startActivity()方法,并传入Intent对象,以启动目标活动。
接收数据:
在目标活动的onCreate()方法中,通过getIntent()方法获取启动该活动的Intent对象。
调用Intent对象的getXXXExtra()方法(其中XXX为数据类型,如String、int等),从Intent中提取出数据。
返回数据:
在目标活动中,如果需要返回数据给第一个活动,可以创建一个新的Intent对象,并通过putExtra()方法将要返回的数据放入Intent中。
调用setResult()方法,并传入新的Intent对象和一个表示结果码(resultCode)的整数。
调用finish()方法,以结束目标活动并返回数据。
处理返回的数据:
在第一个活动中,重写onActivityResult()方法。
当目标活动返回数据时,系统会调用onActivityResult()方法,并传入请求码(requestCode)、结果码(resultCode)和数据Intent(data)。
在onActivityResult()方法中,根据请求码和结果码判断是哪个活动返回的数据,并从数据Intent中提取出数据。
效果展示:
activity12
核心代码:
请求活动代码:
package com.example.application1;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class ACTrequestActivity extends AppCompatActivity implements View.OnClickListener {
private String mRequest = "12345+";
private static final int REQUEST_CODE = 1; // 定义请求码
private TextView tv_response;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a_c_trequest);
TextView tv_request = findViewById(R.id.tv_request);
tv_request.setText("发送的消息是: " + mRequest);
tv_response = findViewById(R.id.tv_response); // 初始化 tv_response
findViewById(R.id.btn_request).setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent(this, ACTresponseActivity.class);
Bundle bundle = new Bundle();
bundle.putString("request_content", mRequest);
intent.putExtras(bundle);
startActivityForResult(intent, REQUEST_CODE); // 传递intent和请求码
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
Bundle bundle = data.getExtras();
if (bundle != null) {
String responseContent = bundle.getString("response_content");
tv_response.setText("接收到的应答是: " + responseContent); // 设置响应文本
}
}
}
}
应答活动代码:
package com.example.application1;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class ACTresponseActivity extends AppCompatActivity implements View.OnClickListener {
private static final String mResponse = "收到请求";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a_c_tresponse);
TextView tv_request = findViewById(R.id.tv_request);
Button btn_response = findViewById(R.id.btn_response); // 正确的按钮引用
// 从上一个页面传来的意图中获取包裹
Bundle bundle = getIntent().getExtras();
String requestContent = bundle.getString("request_content");
tv_request.setText(requestContent);
btn_response.setOnClickListener(this);
TextView tv_response = findViewById(R.id.tv_response);
tv_response.setText("返回的消息: " + mResponse);
}
@Override
public void onClick(View v) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("response_content", mResponse);
intent.putExtras(bundle);
setResult(Activity.RESULT_OK, intent);
finish();
}
}
请求的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送数据"/>
<TextView
android:id="@+id/tv_response"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
应答的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_response"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回应答数据"/>
<TextView
android:id="@+id/tv_response"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>