当前位置: 首页 > article >正文

安卓两个活动之间的消息传输(收到消息后基于应答)

目录

  • 前言:
  • 基础夯实:
  • 效果展示:
  • 核心代码:

前言:

安卓中,两个页面进行数据的传输

基础夯实:

一、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>

http://www.kler.cn/a/370580.html

相关文章:

  • 聊聊如何实现Android 放大镜效果
  • 适配器模式详解:解决接口不兼容问题的灵活设计模式
  • 【视觉惯性SLAM:十七、ORB-SLAM3 中的跟踪流程】
  • 深入理解 SQL 中的 DATEDIFF 函数
  • STL—stack与queue
  • AI刷题-小R的随机播放顺序、不同整数的计数问题
  • 企业财务管理:从每刻到金蝶云星空的报销单集成案例
  • 实验03分支7-13 算术入门之加减乘除
  • 【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024)
  • HarmonyOS“一次开发,多端部署”
  • 即插即用篇 | YOLOv8 引入 空间和通道协同注意力模块 SCSA
  • 【计算机网络一】网络学习前置知识
  • 十四:Python学习笔记--基础知识完结(12)写几个案例 打包exe出来 齐活
  • 1.机器人抓取与操作介绍-深蓝学院
  • softmax回归简洁实现
  • Flutter Row组件实战案例
  • 软考:CORBA架构
  • 高效文本编辑与导航:Vim中的三种基本模式及粘滞位的深度解析
  • 【C++刷题】力扣-#448-找到所有数组中消失的数字
  • 关于整理EACO地球链500个问答0.1的建议,请用数字1-500列出来,谢谢20241028。
  • 使用Django框架开发企业级Web应用
  • NUUO网络视频录像机upload.php任意文件上传漏洞复现
  • 边缘计算网关在储能领域的应用-天拓四方
  • 【对比学习】正交阵/酉矩阵,对称矩阵/Hermite矩阵,正交相似对角化/奇异值分解的内在联系
  • 部署DNS主从服务器
  • go.mod 与go.sum作用