Android移动应用开发教程⑧

在活动之间传递消息

在活动之间传递消息最重要的类型就是intent,下面我们将详细介绍述Intent的用途和组成部分,以及显式Intent和隐式 Intent的区别;接着阐述结合Intent和Bundle向下一个活动页面发送数据,再在下一个页面中解析收到的请求数据;然后叙述从下一个活动页面返回应答数据给上一个页面,并由上一个页面解析返回的应答数据。

一:显式Intent和隐式Intent

Intent的中文名是意图,简单地说,就是传递消息。Intent是各个组件之间信息沟通的桥梁, 既能在Activity之间沟通,又能在Activity与Service之间沟通,也能在Activity与Broadcast之间沟通。总 而言之,Intent用于Android各组件之间的通信,它主要完成下列3部分工作:

  1. 标明本次通信请求从哪里来、到哪里去、要怎么走。
  2. 发起方携带本次通信需要的数据内容,接收方从收到的意图中解析数据。
  3. 发起方若想判断接收方的处理结果,意图就要负责让接收方传回应答的数据内容。

intent的组成元素如下:

指定意图对象的目标有两种表达方式,一种是显式Intent,另一种是隐式Intent。

1.1:显式Intent

显式Intent直接指定来源活动与目标活动,属于精确匹配。

在构建一个意图对象时,需要指定两个参数,第一个参数表示跳转的来源页面,即“来源 Activity.this”; 第二个参数表示待跳转的页面,即“目标Activity.class”。具体的意图构建方式有如下3种:

1.在Intent的构造函数中指定,示例代码如下:

Intent intent = new Intent(this, ActNextActivity.class); // 创建一个目标确定的意图

2.调用意图对象的setClass方法指定,示例代码如下:

Intent intent = new Intent(); // 创建一个新意图
intent.setClass(this, ActNextActivity.class); // 设置意图要跳转的目标活动

3.调用意图对象的setComponent方法指定,示例代码如下:

Intent intent = new Intent(); // 创建一个新意图
// 创建包含目标活动在内的组件名称对象
ComponentName component = new ComponentName(this, ActNextActivity.class);
intent.setComponent(component); // 设置意图携带的组件信息

 1.2:隐式Intent

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

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

常见系统动作的取值说明见表:

动作名称既可以通过setAction方法指定,也可以通过构造函数Intent(String action)直接生成意图对象。 当然,由于动作是模糊匹配,因此有时需要更详细的路径。

Uri和Category便是这样的路径信息,Uri数据可通过构造函数Intent(String action, Uri uri)在生成对象时一起指定,也可 通过setData方法指定(setData这个名字有歧义,实际相当于setUri;Category可通过addCategory 方法指定,之所以用add而不用set方法,是因为一个意图允许设置多个Category,方便一起过滤。

String phoneNo = "12345";
Intent intent = new Intent(); // 创建一个新意图
intent.setAction(Intent.ACTION_DIAL); // 设置意图动作为准备拨号
Uri uri = Uri.parse("tel:" + phoneNo); // 声明一个拨号的Uri
intent.setData(uri); // 设置意图前往的路径
startActivity(intent); // 启动意图通往的活动页面

// 验证是否有activity处理该Intent
if (sendIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(sendIntent);
}

调用 startActivity() 时,系统将检查已安装的所有应用,确定哪些应用能够处理这种 Intent(即:含 ACTION_SEND 操作并携带"text/plain"数据的 Intent )。 如果只有一个应用能够处理,则该应用将立即打开并为其提供 Intent。 如果多个 Activity 接受 Intent,则系统将显示一个对话框,使用户能够选取要使用的应用。

 隐式Intent还用到了过滤器的概念,把不符合匹配条件的过滤掉,剩下符合条件的按照优先顺序调用。 譬如创建一个App模块,AndroidManifest.xml里的intent-filter就是配置文件中的过滤器。像最常见的 首页活动MainAcitivity,它的activity节点下面便设置了action和category的过滤条件。其中 android.intent.action.MAIN表示App的入口动作,而android.intent.category.LAUNCHER表示在桌面 上显示App图标,配置样例如下:

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

二:向Activity发送数据和返回数据

2.1向下一个Activity发送数据

上一小节提到,Intent对象的setData方法只指定到达目标的路径,并非本次通信所携带的参数信息,真正的参数信息存放在Extras中。Intent重载了很多种putExtra方法传递各种类型的参数,包括整型、双精度型、字符串等基本数据类型,甚至Serializable这样的序列化结构。

只是调用putExtra方法显然不好 管理,像送快递一样大小包裹随便扔,不但找起来不方便,丢了也难以知道。

所以Android引入了 Bundle概念,可以把Bundle理解为超市的寄包柜或快递收件柜,大小包裹由Bundle统一存取,方便又 安全。 Bundle内部用于存放消息的数据结构是Map映射,既可添加或删除元素,还可判断元素是否存在。开发者若要把Bundle数据全部打包好,只需调用一次意图对象的putExtras方法;若要把Bundle数据全部取 出来,也只需调用一次意图对象的getExtras方法。Bundle对象操作各类型数据的读写方法说明见表

 接下来举个在活动之间传递数据的例子,首先在上一个活动使用包裹封装好数据,把包裹塞给意图对 象,再调用startActivity方法跳到意图指定的目标活动。完整的活动跳转代码示例如下:

// 创建一个意图对象,准备跳到指定的活动页面
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); // 跳转到意图指定的活动页面

然后在下一个活动中获取意图携带的快递包裹,从包裹取出各参数信息,并将传来的数据显示到文本视图。下面便是目标活动获取并展示包裹数据的代码例子:

// 从布局文件中获取名为tv_receive的文本视图
TextView tv_receive = findViewById(R.id.tv_receive);
// 从上一个页面传来的意图中获取快递包裹
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); // 把请求消息的详情显示在文本视图上

2.2:向上一个Activity返回数据

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

步骤一,上一个页面打包好请求数据,调用startActivityForResult方法执行跳转动作,表示需要处理下 一个页面的应答数据,该方法的第二个参数表示请求代码,它用于标识每个跳转的唯一性。跳转代码示例如下:

String 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", request);
intent.putExtras(bundle); // 把快递包裹塞给意图
// 期望接收下个页面的返回数据。第二个参数为本次请求代码
startActivityForResult(intent, 0);

步骤二,下一个页面接收并解析请求数据,进行相应处理。接收代码示例如下:

// 从上一个页面传来的意图中获取快递包裹
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); // 把请求消息的详情显示在文本视图上

步骤三,下一个页面在返回上一个页面时,打包应答数据并调用setResult方法返回数据包裹。setResult 方法的第一个参数表示应答代码(成功还是失败),第二个参数为携带包裹的意图对象。返回代码示例如下:

String response = "我吃过了,还是你来我家吃";
Intent intent = new Intent(); // 创建一个新意图
Bundle bundle = new Bundle(); // 创建一个新包裹
// 往包裹存入名为response_time的字符串
bundle.putString("response_time", DateUtil.getNowTime());
// 往包裹存入名为response_content的字符串
bundle.putString("response_content", response);
intent.putExtras(bundle); // 把快递包裹塞给意图
// 携带意图返回上一个页面。RESULT_OK表示处理成功
setResult(Activity.RESULT_OK, intent);
finish(); // 结束当前的活动页面

步骤四,上一个页面重写方法onActivityResult,该方法的输入参数包含请求代码和结果代码,其中请求代码用于判断这次返回对应哪个跳转,结果代码用于判断下一个页面是否处理成功。如果下一个页面处理成功,再对返回数据解包操作,处理返回数据的代码示例如下:

// 从下一个页面携带参数返回当前页面时触发。其中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); // 把返回消息的详情显示在文本视图上
}
}

【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于ESP8266的WiFi自动打卡考勤系统
单片机菜鸟哥的博客
12-29 2241
现代社会上,基本上人手一部智能手机,自带wifi功能。只要我们打开了WiFi功能,我们就可以通过`自动捕获手机`发出的 802.11 帧 来获取到对应的手机MAC地址。当我们在后台服务器上预先配置好 MAC地址与用户信息的关联关系(比如`用户名字、用户工号、学生编号`等),并且把捕获到的MAC地址上传到后台服务器进行对比,我们就可以完成自动考勤或者无线点名功能。这整个过程都是无感知、全自动。
mipi接口 1280(RGB)*720 LCD屏开发驱动笔记帖
Web3oUser的博客
01-19 3954
创业开发安卓硬件产品
android移动开发简单的开发实例
woshixhw的专栏
10-11 3148
<br />技术博客: http://blog.sina.com.cn/s/articlelist_1766082610_0_1.html<br /> <br /> <br /> <br />呵呵今天终于写了两个跳转的actity的页面,感觉还可以,再接再厉,争取用一个月的时间将android达到上手的程度,呵呵  好了,下面记录下我今天晚上的android实例:<br />开发环境:windowXP、androidSDK2.2、eclipse3.4(关于环境配置请看我的另外一篇博客文章介绍)<br />项
Android】【移动应用开发】基础案列
我的的博客哦
03-27 6776
⚪页面布局代码如下: 动态向左移动⚪页面布局代码如下: ⚪Java代码如下: ⚪页面布局代码如下: ⚪Java代码如下: ⚪页面布局代码如下: ⚪页面布局代码如下: 新建低部布局文件bottom.xml 新建主界面布局文件main_layout.xml 添加三个布局文件用于在主界面的FrameLayout位置动态显示内容 1)布局文件 2)Java代码 底部有几个按钮,就创建几个【同上】类似的就可了;⚪主界面Java代码如下(MainActivity.java): ⚪页面布局代码如下:
Android移动应用开发
m0_56308072的博客
06-13 2019
一般由三个文件对应创建Java类与之对应一个layout的xml文件我们创建一个button,其中有两个元素然后我们回到与之对应的Java项目中的任何资源都会在R文件中自动生成一个id,我们只需要调用即可我们进入AndroidManidfest.xml注册,并为之配置一个主活动,告诉程序开机就启动这个活动。
Android移动应用开发教程
qq_64618483的博客
02-25 317
本章为第三篇,主要讲解了对Activity的理解和Android的程序设计规范。讲解了界面布局中xml文件各类代码的含义,并且展示了如何利用java代码来修改xml界面显示的内容。最后通过一个例子展示了如何实现app界面的跳转,介绍了activity界面的两种创建方式。
Android移动应用基础教程》(Android Studio)(第二版)黑马教程 课后题答案 第8章
An_xx_的博客
07-18 2016
Android移动应用基础教程》(Android Studio)(第二版)黑马教程 课后题答案 第8章 一、填空题 BroadcastReceiver 无序广播和有序广播 动态注册和静态注册 二、判断题 1、对 2、对 3、错 4、对 5、错 三、选择题 BC C 四、简答题 广播机制的实现过程 答:Android中的广播使用了观察者模式,即基于消息的发布/订阅事件的模式。广播发送者和接收者分别处于观察者模式中的消息发布和订阅两端。广播机制的实现过程具体如下: (1)广
新版Android开发教程.rar
12-14
Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优 • ...
Web笔记之移动端开发
Mr__Zhang___的博客
04-17 1911
1、移动端基础 ①浏览器现状 说明:国内的UC和QQ,百度等手机浏览器都是根据Webkit修改过来的内核,国内尚无自主研发的内核,就像国内的手机操作系统都是基于Android修改开发的一样。 总结:兼容移动端主流浏览器,处理Webkit内核浏览器即可。 ②手机屏幕现状 ● 移动端设备屏幕尺寸非常多,碎片严重。 ● Android设备有多种分辨率∶......
多家一线互联网公司Android面试题:小米+百度+360+美团
粉丝交流群:957013433
03-08 416
前言 春节已经过去了一个月有余,又到了一年一度的跳槽找工作的时候了,相信很多认在这一段时间面试了很多公司确迟迟得不到心仪公司的offer 接下来,我会整理一些一线互联网公司的面试题,希望能在面试的时候帮助到大家【文末有彩蛋】 1.抽象类接口区别-360 ①默认的方法实现 抽象类可以有默认的方法实现完全是抽象的。接口根本不存在方法的实现 ②实现 子类使用extend...
Android移动应用开发(第3版)卷Ⅰ基础篇.pdf
12-24
Android移动应用开发(第3版)卷Ⅰ基础篇.pdf
Android移动应用开发案例教程》电子课件
01-28
文件中包含《Android移动应用开发案例教程》电子课件,供Android移动开发者学习使用。
ANDROID移动开发基础案例教程
04-14
入门书籍,可以参考学习。ANDROID移动开发基础案例教程
Android移动开发基础案例教程》源代码.7z
06-11
  由传智播客高教产品研发部编著的《Android移动应用基础教程》为Android入门书籍,本书站在初学者的角度,将每个讲解的知识都进行了深入分析,并使用生动形象的情景举例,将复杂和难以理解的知识进行简单。针对每个知识点,精心设计了相应的案例,力求每个案例都能贴合实际工作需求,真正做到把书本上的知识应用到实际开发中。   本书附有配套的教学PPT、题库(2000道)、教学视频、源代码、教学补充案例、教学设计等资源。同时,为了帮助初学者及时地解决学习过程中遇到的问题,传智播客还专门提供了免费的在线答疑平台,并承诺在3小时内针对问题给予解答。   本书可作为高等院校本、专科计算机相关专业程序设计类课程专用教材。
Android移动开发案例教程》_源代码A
03-25
这个是工业和信息“十三五”人才培养规划教材Android移动开发基础案例教程,黑马程序员编著配套源代码
Android移动开发基础案例教程 第3章 Activity
学无止境,勤则可达;志存高远,恒亦能成!
04-06 4499
文章目录3.1 Activity的创建3.2 Activity的生命周期3.3 Activity的启动模式3.3.1 Android中的任务栈3.3.2 Activity的四种启动模式3.4 Activity之间的跳转3.4.1 显式意图3.4.2 隐式意图3.4.2 实战演练——打开浏览器3.5 Activity中的数据传递3.5.1 数据传递3.5.2 实战演练——注册用户信息3.5.3 数据回传3.5.4 实战演练——选择宝宝装备3.6 本章小结 3.1 Ac
【创新项目实训】Android移动开发教学——安装Android Studio 3.5.2
Alice_q的博客
04-18 1530
Android Studio 3.5.2 安装教程一、下载安装包二、安装配置JDK三、安装Android Studio 本次项目使用的是Android Studio 4.1.3,但是直接升级的并没有过程,所以以下教程基于3.5.2版本。 一、下载安装包 官网下载地址 Android Studio下载,默认是最新版本,可以下划进入download archives下载其他版本 二、安装配置JDK 安装好JDK后复制安装路径,开始配置环境变量 添加系统环境变量 变量名:JAVA_HOME 变量值:安装路径
2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第一章:Android开发环境搭建
weixin_43895667的博客
07-18 3372
2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第一章:Android开发环境搭建
安卓Android ·移动应用开发 创建第一个Android项目
最新发布
m0_74154295的博客
02-08 3881
可以选择我们的模拟器,甚至我们可以通过手机屏幕共享的方式,把手机的开发者模式打开等操作,下载到本机手机之中,可以0距离的感受,程序之美。
写文章

热门文章

  • Spine动画导入unity后有白边的解决方法 2424
  • Android移动应用开发教程① 2259
  • Android移动应用开发教程② 435
  • Android移动应用开发教程③ 317
  • 不同Android项目整合方面的理解(学生向) 260

分类专栏

  • Android移动应用开发教程笔记 8篇

最新评论

  • Spine动画导入unity后有白边的解决方法

    CSDN-Ada助手: 恭喜你写完了第11篇博客!在标题中提到的解决Spine动画导入unity后出现的白边问题的方法很有帮助。你的经验分享对其他使用Spine动画的人来说一定非常有用。不过,我想提供一些建议,希望能进一步丰富你的创作。下次你可以考虑分享一些关于Spine动画的高级技巧或者更深入的教程,这样能够帮助读者更好地理解和应用这些技术。期待看到你未来更多的精彩博客!

  • 不同Android项目整合方面的理解(学生向)

    CSDN-Ada助手: 恭喜您写了第10篇博客!您的《不同Android项目整合方面的理解(学生向)》让我受益匪浅。希望您能继续坚持写作,分享您的学习心得和经验,让更多的人受益。下一步的创作建议是,可以尝试写一些实践性的内容,分享您在实战中的经验和教训,让读者更加深入地了解Android开发。期待您的新作品! CSDN 会根据你创作的博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply10 看奖励名单。

  • Android移动应用开发教程①

    CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天最佳新人】榜单,全部的排名请看 https://bbs.csdn.net/topics/613535382。

最新文章

  • Python作业实验习题
  • Python中的闭包和装饰器
  • Spine动画导入unity后有白边的解决方法
2023年13篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司上城网站推广优化网站优化的方法娄底网站排名优化怎么做b2b网站优化技巧兰州网站整站优化有效吗兰州网站优化怎样写自己的东西商丘网站搜索引擎优化排名价格网站快速排名优化方法黄浦网站优化品牌网站优化视频泉山区网站优化哪家便宜网站优化营销专用车网站优化分析网站制订优化目标乳山网站的优化网站优化推广服务至上湖北百度网站优化运营晋宁网站优化方案怎么做对网站优化汕头网站优化人员平顶山专业网站优化地址荆门工厂网站优化怎么做优化网站软件牡丹江网站推广优化州优化网站湛江网站优化问普陀区企业网站优化费用湘潭网站建设及优化网站目录优化需要注意什么优化公司网站很好火26星香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化