news 2026/3/8 0:47:20

安卓基础之《(4)—Activity组件(2)》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
安卓基础之《(4)—Activity组件(2)》

==========在活动之间传递消息==========

五、显示Intent和隐式Intent

1、什么是Intent
Intent是各个组件之间信息沟通的桥梁,它用于Android各组件之间的通信,主要完成下列工作:
(1)标明本次通信请求从哪里来、到哪里去、要怎么走
(2)发起方携带本次通信需要的数据内容,接收方从收到的Intent中解析数据
(3)发起方若想判断接收方的处理结果,Intent就要负责让接收方传回应答的数据内容

2、Intent的组成部分

元素名称设置方法说明与用途
ComponentsetComponent组件,它指定Intent的来源与目标
ActionsetAction动作,它指定Intent的动作行为
DatasetData即Uri,它指定Action要操作的数据路径
CategoryaddCategory类别,它指定Intent的操作类别
TypesetType数据类型,它指定消息的数据类型
ExtrasputExtras扩展信息,它指定装载的Bundle(包裹)信息
FlagssetFlags标志位,它指定Activity的启动标志

3、显示Intent
显示Intent,直接指定来源Activity与目标Activity,属于精确匹配。它有三种构建方式:
(1)在Intent的构造函数中指定
(2)调用Intent对象的setClass方法指定
(3)调用Intent对象的setComponent方法指定

4、显示调用例子
(1)在Intent的构造函数中指定

// 1.在Intent的构造函数中指定 Intent intent = new Intent(ActStartActivity.this, ActFinishActivity.class);

(2)调用Intent对象的setClass方法指定

// 2.调用Intent对象的setClass方法指定 Intent intent = new Intent(); intent.setClass(ActStartActivity.this, ActFinishActivity.class);

(3)调用Intent对象的setComponent方法指定

// 3.调用Intent对象的setComponent方法指定 Intent intent = new Intent(); ComponentName component = new ComponentName(ActStartActivity.this, ActFinishActivity.class); intent.setComponent(component);

(4)对于第三方包,ComponentName还可以用包名和类名加载

ComponentName component = new ComponentName("com.example.chapter04", "com.example.chapter04.ActFinishActivity");

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

通常App不希望向外部暴露Activity名称,只给出一个事先定义好的标记串,这样大家约定俗成、按图索骥就好,隐式Intent便起到了标记过滤作用。这个动作名称标记串,可以是自己定义的动作,也可以是已有的系统动作

常见系统动作的取值说明

Intent类的系统动作常量名系统动作的常量名说明
ACTION_MAINandroid.intent.action.MAINApp启动时的入口
ACTION_VIEWandroid.intent.action.VIEW向用户显示数据
ACTION_SENDandroid.intent.action.SEND分享内容
ACTION_CALLandroid.intent.action.CALL直接拨号
ACTION_DIALandroid.intent.action.DIAL准备拨号
ACTION_SENDTOandroid.intent.action.SENDTO发送短信
ACTION_ANSWERandroid.intent.action.ANSWER接听电话

6、Action分析
以打电话为例:
ACTION_DIAL定义

public static final String ACTION_DIAL = "android.intent.action.DIAL";

在打电话的Activity里配置了android.intent.action.DIAL,所以你调用ACTION_DIAL就会跳转的打电话页面
如果两个Activity都配置了相同ACTION,会怎么样?会让你选用哪个。和你手机里打开网页,让你选用系统浏览器、360浏览器、UC浏览器,是一样的

7、ActionUriActivity.java

package com.example.chapter04; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; 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); findViewById(R.id.btn_my).setOnClickListener(this); } @Override public void onClick(View view) { String phoneNo = "12345"; if (view.getId() == R.id.btn_dial) { Intent intent = new Intent(); // 设置Intent动作为准备拨号 intent.setAction(Intent.ACTION_DIAL); // 声明一个拨号Uri Uri uri = Uri.parse("tel:" + phoneNo); intent.setData(uri); startActivity(intent); } else if (view.getId() == R.id.btn_sms) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); Uri uri2 = Uri.parse("smsto:" + phoneNo); intent.setData(uri2); startActivity(intent); } else if (view.getId() == R.id.btn_my) { Intent intent = new Intent(); // 调用chapter03的页面 // 可以启动已经退出的应用 intent.setAction("android.intent.action.TEST"); intent.addCategory(Intent.CATEGORY_DEFAULT); startActivity(intent); } } }

六、向下一个Activity发送数据

1、Intent使用Bundle对象存放待传递的数据信息
Bundle相当于快递盒

2、Bundle对象操作各类型数据的读写方法说明

数据类型读方法写方法
整型数getIntputInt
浮点数getFloatputFloat
双精度数getDoubleputDouble
布尔值getBooleanputBoolean
字符串getStringputString
字符串数组getStringArrayputStringArray
字符串列表getStringArrayListputStringArrayList
可序列化结构getSerializableputSerializable

3、接收Intent发过来的Bundle
其实在另一个页面这里,这个Activity已经接收到了发过来的Intent,只需要调用getIntent方法获取Intent,然后再getExtras,这样就能把额外的数据拿出来了

4、Bundle
(1)在代码中发送消息包裹,调用Intent对象的putExtras方法,即可存入消息包裹
(2)在代码中接收消息包裹,调用Intent对象的getExtras方法,即可取出消息包裹

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/3 1:43:23

Java毕设项目:基于JAVA的北京市公交管理系统基于Java+Vue+SpringBoot的北京市公交管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/3/4 20:18:26

C++医学图像处理经典ITK库用法详解<三>: 图像配准模块功能

1、ITK库概述ITK (Insight Segmentation and Registration Toolkit) 是一个开源的跨平台软件开发工具包,主要用于图像处理,特别是生物医学图像处理领域。该工具包提供了一套丰富的图像处理算法,特别是在图像分割和配准方面具有强大的功能。IT…

作者头像 李华
网站建设 2026/3/5 9:08:43

为什么XGBoost在绝大多数情况下都比深度学习算法效果好?甚至秒杀各种新提出的算法!原创未发表!!基于非线性二次分解的Ridge-RF-XGBoost时间序列预测

近年来,尽管深度学习在图像识别、自然语言处理等领域取得了显著成功,但在结构化数据(tabular data)上的回归与分类任务中,梯度提升树模型——特别是XGBoost(eXtreme Gradient Boosting)——在绝…

作者头像 李华
网站建设 2026/3/7 16:13:49

小程序毕设项目:基于springboot+微信小程序的选修课管理系统的设计与实现(源码+文档,讲解、 调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/3/2 5:33:35

小程序毕设项目:基于springboot+微信小程序的智能医疗管理系统设计与实现(源码+文档,讲解、 调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/3/5 19:31:41

台式电脑无线网卡连接全攻略,看完就能上网

很多使用台式电脑的朋友,可能会发现电脑无法连接WiFi上网,需要自己额外安装一个无线网卡。我当初也是想连接wifi时,才开始认真研究无线网卡怎么连接台式电脑。过程中踩过不少坑,后来才慢慢明白,其实问题并不复杂&#…

作者头像 李华