Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)

简介: Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)

运行有问题或需要源码请点赞关注收藏后评论区留言~~

显示Intent和隐式Intent

Intent是各个组件之间的信息沟通的桥梁,既能在Activity之间沟通,又能在Activity与Service沟通,也能在Activtiy与Broadcast之间沟通,总而言之,Intent用于Android各组件之间的通信 它主要处理以下三部分工作

1:表明本次通信请求从哪里来  到哪里去 要怎么走

2:发起方携带本次通信需要的数据内容

3:发起方若想判断接收方的处理结果 Intent就要负责让接收方传回应答的数据内容

1:显示Intent 直接指定来源活动与目标活动 属于精确匹配

2:隐式Intent 没有明确地指定要跳转的目标活动 只给出一个动作字符串让系统自动匹配,属于模糊匹配

下面实现一个简单的调用系统拨号程序的例子 效果如下

ActionUriActivity类代码如下

package com.example.chapter04;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
public class ActionUriActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_action_uri);
        findViewById(R.id.btn_dial).setOnClickListener(this);
        findViewById(R.id.btn_sms).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        String phoneNo = "12345";
        if (v.getId() == R.id.btn_dial) { // 点击了“跳到拨号页面”按钮
            Intent intent = new Intent(); // 创建一个新意图
            intent.setAction(Intent.ACTION_DIAL); // 设置意图动作为准备拨号
            Uri uri = Uri.parse("tel:" + phoneNo); // 声明一个拨号的Uri
            intent.setData(uri); // 设置意图前往的路径
            startActivity(intent); // 启动意图通往的活动页面
        } else if (v.getId() == R.id.btn_sms) { // 点击了“跳到短信页面”按钮
            Intent intent = new Intent(); // 创建一个新意图
            intent.setAction(Intent.ACTION_SENDTO); // 设置意图动作为发短信
            Uri uri = Uri.parse("smsto:" + phoneNo); // 声明一个发送短信的Uri
            intent.setData(uri); // 设置意图前往的路径
            startActivity(intent); // 启动意图通往的活动页面
        }
    }
}

activity_action_uriXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="点击以下按钮将向号码12345发起请求"
        android:textColor="@color/black"
        android:textSize="17sp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_dial"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="跳到拨号页面"
            android:textColor="@color/black"
            android:textSize="17sp" />
        <Button
            android:id="@+id/btn_sms"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="跳到短信页面"
            android:textColor="@color/black"
            android:textSize="17sp" />
    </LinearLayout>
</LinearLayout>

向下一个Activity发送数据

Android引入了Bundle概念,可以把Bundle理解为超市的寄包柜或快递收件柜,大小包裹由Bundle统一存取。Bundle内部用于存放信息的数据结构是Map映射,既可添加或删除元素,还可以判断元素是否存在

Bundle对象操作各类型数据的读写方法说明如下图

 

ActSendActivity类代码如下

package com.example.chapter04;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.example.chapter04.util.DateUtil;
public class ActSendActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tv_send; // 声明一个文本视图对象
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_send);
        // 从布局文件中获取名叫tv_send的文本视图
        tv_send = findViewById(R.id.tv_send);
        findViewById(R.id.btn_send).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_send) {
            // 创建一个意图对象,准备跳到指定的活动页面
            Intent intent = new Intent(this, ActReceiveActivity.class);
            Bundle bundle = new Bundle(); // 创建一个新包裹
            // 往包裹存入名叫request_time的字符串
            bundle.putString("request_time", DateUtil.getNowTime());
            // 往包裹存入名叫request_content的字符串
            bundle.putString("request_content", tv_send.getText().toString());
            intent.putExtras(bundle); // 把快递包裹塞给意图
            startActivity(intent); // 跳转到意图指定的活动页面
        }
    }
}

activity_act_sendXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/tv_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="今天的天气真不错"
        android:textColor="#000000"
        android:textSize="17sp" />
    <Button
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="发送以上文字"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

ActReceiveActivity类代码如下

package com.example.chapter04;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class ActReceiveActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_receive);
        // 从布局文件中获取名叫tv_receive的文本视图
        TextView tv_receive = findViewById(R.id.tv_receive);
        findViewById(R.id.btn_receive).setOnClickListener(this);
        // 从上一个页面传来的意图中获取快递包裹
        Bundle bundle = getIntent().getExtras();
        // 从包裹中取出名叫request_time的字符串
        String request_time = bundle.getString("request_time");
        // 从包裹中取出名叫request_content的字符串
        String request_content = bundle.getString("request_content");
        String desc = String.format("收到请求消息:\n请求时间为%s\n请求内容为%s",
                request_time, request_content);
        tv_receive.setText(desc); // 把请求消息的详情显示在文本视图上
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_receive) {
            finish(); // 结束当前的活动页面
        }
    }
}

activity_act_receiveXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/tv_receive"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:textColor="#000000"
        android:textSize="17sp" />
    <Button
        android:id="@+id/btn_receive"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="知道了"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

向上一个Activity返回数据

数据传递经常是相互的,上一个页面不但把请求数据发送到下一个页面,有时候还要处理下一个页面的应答数据,所谓应答发生在下一个页面返回到上一个页面之际。如果只把请求数据发送到下一个页面,上一个页面调用startActivity即可。如果还要处理下一个页面的应答数据,此时就得分多步处理 效果如下

ActRequestActivity类代码如下

package com.example.chapter04;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.chapter04.util.DateUtil;
public class ActRequestActivity extends AppCompatActivity implements View.OnClickListener {
    private String mRrequest = "你吃饭了吗?来我家吃吧";
    private TextView tv_response; // 声明一个文本视图对象
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_request);
        // 从布局文件中获取名叫tv_request的文本视图
        TextView tv_request = findViewById(R.id.tv_request);
        tv_request.setText("待发送的消息为:"+mRrequest);
        // 从布局文件中获取名叫tv_response的文本视图
        tv_response = findViewById(R.id.tv_response);
        findViewById(R.id.btn_request).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_request) {
            // 创建一个意图对象,准备跳到指定的活动页面
            Intent intent = new Intent(this, ActResponseActivity.class);
            Bundle bundle = new Bundle(); // 创建一个新包裹
            // 往包裹存入名叫request_time的字符串
            bundle.putString("request_time", DateUtil.getNowTime());
            // 往包裹存入名叫request_content的字符串
            bundle.putString("request_content", mRrequest);
            intent.putExtras(bundle); // 把快递包裹塞给意图
            // 期望接收下个页面的返回数据。第二个参数为本次请求代码
            startActivityForResult(intent, 0);
        }
    }
    // 从下一个页面携带参数返回当前页面时触发。其中requestCode为请求代码,
    // resultCode为结果代码,intent为下一个页面返回的意图对象
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { // 接收返回数据
        super.onActivityResult(requestCode, resultCode, intent);
        // 意图非空,且请求代码为之前传的0,结果代码也为成功
        if (intent!=null && requestCode==0 && resultCode== Activity.RESULT_OK) {
            Bundle bundle = intent.getExtras(); // 从返回的意图中获取快递包裹
            // 从包裹中取出名叫response_time的字符串
            String response_time = bundle.getString("response_time");
            // 从包裹中取出名叫response_content的字符串
            String response_content = bundle.getString("response_content");
            String desc = String.format("收到返回消息:\n应答时间为:%s\n应答内容为:%s",
                    response_time, response_content);
            tv_response.setText(desc); // 把返回消息的详情显示在文本视图上
        }
    }
}

activity_act_requestXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:textColor="#000000"
        android:textSize="17sp" />
    <Button
        android:id="@+id/btn_request"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="传送请求数据"
        android:textColor="#000000"
        android:textSize="17sp" />
    <TextView
        android:id="@+id/tv_response"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

ActResponseActivity类代码如下

package com.example.chapter04;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.chapter04.util.DateUtil;
public class ActResponseActivity extends AppCompatActivity implements View.OnClickListener {
    private String mResponse = "我吃过了,还是你来我家吃";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_response);
        // 从布局文件中获取名叫tv_request的文本视图
        TextView tv_request = findViewById(R.id.tv_request);
        findViewById(R.id.btn_response).setOnClickListener(this);
        // 从布局文件中获取名叫tv_response的文本视图
        TextView tv_response = findViewById(R.id.tv_response);
        tv_response.setText("待返回的消息为:"+mResponse);
        // 从上一个页面传来的意图中获取快递包裹
        Bundle bundle = getIntent().getExtras();
        // 从包裹中取出名叫request_time的字符串
        String request_time = bundle.getString("request_time");
        // 从包裹中取出名叫request_content的字符串
        String request_content = bundle.getString("request_content");
        String desc = String.format("收到请求消息:\n请求时间为:%s\n请求内容为:%s",
                request_time, request_content);
        tv_request.setText(desc); // 把请求消息的详情显示在文本视图上
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_response) {
            Intent intent = new Intent(); // 创建一个新意图
            Bundle bundle = new Bundle(); // 创建一个新包裹
            // 往包裹存入名叫response_time的字符串
            bundle.putString("response_time", DateUtil.getNowTime());
            // 往包裹存入名叫response_content的字符串
            bundle.putString("response_content", mResponse);
            intent.putExtras(bundle); // 把快递包裹塞给意图
            // 携带意图返回上一个页面。RESULT_OK表示处理成功
            setResult(Activity.RESULT_OK, intent);
            finish(); // 结束当前的活动页面
        }
    }
}

activity_act_responseXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:textColor="#000000"
        android:textSize="17sp" />
    <Button
        android:id="@+id/btn_response"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="返回应答数据"
        android:textColor="#000000"
        android:textSize="17sp" />
    <TextView
        android:id="@+id/tv_response"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏

相关文章
|
5天前
|
JSON 编译器 开发工具
VS Code阅读Android源码
VS Code阅读Android源码
12 1
|
25天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
53 1
|
25天前
|
Java Android开发
Android反编译查看源码
Android反编译查看源码
25 0
|
5天前
|
Linux 开发工具 Android开发
Docker系列(1)安装Linux系统编译Android源码
Docker系列(1)安装Linux系统编译Android源码
7 0
|
12天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
11 0
|
12天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
10 0
|
18天前
|
监控 数据可视化 安全
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
环境实时数据、动态监测报警,实时监控施工环境状态,有针对性地预防施工过程中的环境污染问题,打造文明生态施工,创造绿色的生态环境。
14 0
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
|
25天前
|
XML Java Android开发
Android每点击一次按钮就添加一条数据
Android每点击一次按钮就添加一条数据
24 1
|
29天前
|
Java Android开发
Android Studio的使用导入第三方Jar包
Android Studio的使用导入第三方Jar包
12 1
游戏直播APP平台开发多少钱成本:定制与成品源码差距这么大
开发一款游戏直播APP平台所需的费用是多少?对于计划投身这一领域的投资者来说,首要关心的问题之一就是。本文将探讨两种主要的开发模式——定制开发与成品源码二次开发的成本差异及其优劣势。