null第6章 组件通信与广播消息第6章 组件通信与广播消息本章学习目标本章学习目标了解使用Intent进行组件通信的原理
掌握使用Intent启动Activity的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
掌握获取Activity返回值的方法
了解Intent过滤器的原理与匹配机制
掌握发送和接收广播消息的方法
6.1 Intent6.1 IntentIntent是一个动作的完整描述,包含了动作的产生组件、接收组件和传递的数据信息
Intent也可称为一个在不同组件之间传递的消息,这个消息在到达接收组件后,接收组件会执行相关的动作
Intent为Activity、Service和BroadcastReceiver等组件提供交互能力
Intent的用途
启动Activity和Service
在Android系统上发布广播消息
广播消息可以是接收到特定数据或消息,也可以是手机的信号变化或电池的电量过低等信息
6.1 Intent6.1 Intent6.1.1 启动Activity
在Android系统中,应用程序一般都有多个Activity,Intent可以实现不同Activity之间的切换和数据传递
启动Activity方式
显式启动,必须在Intent中指明启动的Activity所在的类
隐式启动, Android系统根据Intent的动作和数据来决定启动哪一个Activity,也就是说在隐式启动时,Intent中只包含需要执行的动作和所包含的数据,而无需指明具体启动哪一个Activity,选择权有Android系统和最终用户来决定6.1 Intent6.1 Intent6.1.1 启动Activity
显式启动
使用Intent显式启动Activity
创建一个Intent
指定当前的应用程序上下文以及要启动的Activity
把创建好的这个Intent作为参数传递给startActivity()方法
6.1 Intent6.1 Intent6.1.1 启动Activity
显式启动
IntentDemo示例说明如何使用Intent启动新的Activity
IntentDemo示例包含两个Activity类
IntentDemo
ActivityToStart
程序启动是默认启动IntentDemo这个Activity
6.1 Intent6.1 Intent6.1.1 启动Activity
显式启动
点击“启动Activity”按钮后,程序启动ActivityToStart这个Activity
6.1 Intent6.1 Intent6.1.1 启动Activity
显式启动
在AndroidManifest.xml文件中注册上面这两个Activity,应使用
标签,嵌套在标签内部
6.1 Intent6.1 Intent6.1.1 启动Activity
显式启动
Android应用程序中,用户使用的每个组件都必须在AndroidManifest.xml文件中的节点内定义
节点下共有两个节点,分别代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
应用程序中所使用的两个Activity,IntentDemo和ActivityToStart6.1 Intent6.1 Intent6.1.1 启动Activity
显式启动
在IntentDemo.java文件中,包含了显示使用Intent启动Activity的核心代码
在点击事件的处理
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
中,Intent构造函数的第1个参数是应用程序上下文,程序中的应用程序上下文就是IntentDemo;第2个参数是接收Intent的目标组件,使用的是显式启动方式,直接指明了需要启动的Activity6.1 Intent6.1 Intent6.1.1 启动Activity
隐式启动
优点:不需要指明需要启动哪一个Activity,而由Android系统来决定,有利于使用第三方组件
隐式启动Activity时,Android系统在应用程序运行时解析Intent,并根据一定的
规则
编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf
对Intent和Activity进行匹配,使Intent上的动作、数据与Activity完全吻合
匹配的Activity可以是应用程序本身的,也可以是Android系统内置的,还可以是第三方应用程序提供的。因此,这种方式更加强调了Android应用程序中组件的可复用性
6.1 Intent6.1 Intent6.1.1 启动Activity
隐式启动
在缺省情况下,Android系统会调用内置的Web浏览器
Intent的动作是Intent.ACTION_VIEW,根据URI的数据类型来匹配动作
数据部分的URI是Web地址,使用Uri.parse(urlString)方法,可以简单的把一个字符串解释成Uri对象
Intent的语法如下
Intent构造函数的第1个参数是Intent需要执行的动作
第2个参数是URI,表示需要传递的数据6.1 Intent6.1 Intent6.1.1 启动Activity
隐式启动
Android系统支持的常见动作字符串常量表6.1 Intent6.1 Intent6.1.1 启动Activity
隐式启动
WebViewIntentDemo示例说明如何隐式启动Activity
6.1 Intent6.1 Intent6.1.1 启动Activity
隐式启动
当用户在文本框中输入要访问网址后,通过点击“浏览此URL”按钮,程序根据用户输入的网址生成一个Intent,并以隐式启动的方式调用Android内置的Web浏览器,并打开指定的Web页面
本例输入的网址是哈尔滨
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
大学的主站地址,地址是:http://www.hrbeu.edu.cn6.1 Intent6.1 Intent6.1.2 获取Activity返回值
在上一小节IntentDemo示例中,通过使用startActivity(Intent)方法启动Activity后,启动后的两个Activity之间相互独立,没有任何的关联
在很多情况下,后启动的Activity是为了让用户对特定信息进行选择,在关闭这个Activity后,用户的选择信息需要返回给未关闭的那个Activity
按照Activity启动的先后顺序,先启动的称为父Activity,后启动的称为子Activity
如果需要将子Activity的部分信息返回给父Activity,则可以使用Sub-Activity的方式去启动子Activity
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
获取子Activity的返回值,一般可以分为以下三个步骤
以Sub-Activity的方式启动子Activity
设置子Activity的返回值
在父Activity中获取返回值
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
以Sub-Activity的方式启动子Activity
调用startActivityForResult(Intent, requestCode)函数
参数Intent用于决定启动哪个Activity
参数requestCode是唯一的标识子Activity的请求码
显式启动子Activity的代码如下
隐式启动子Activity的代码如下
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
设置子Activity的返回值
在子Activity调用finish()函数关闭前,调用setResult()函数将所需的数据返回给父Activity
setResult()函数有两个参数
结果码
返回值
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
设置子Activity的返回值
结果码表明了子Activity的返回状态,通常为Activity.RESULT_OK或者Activity.RESULT_CANCELED,或自定义的结果码,结果码均为整数类型
返回值用封装在Intent中,子Activity通过Intent将需要返回的数据传递给父Activity。数据主要是Uri形式,可以附加一些额外信息,这些额外信息用Extra的集合表示
下面代码说明如何在子Activity中设置返回值6.1 Intent6.1 Intent6.1.2 获取Activity返回值
在父Activity中获取返回值
当子Activity关闭时,启动它的父Activity的onActivityResult()函数将被调用;如果需要在父Activity中处理子Activity的返回值,则重载此函数即可
此函数的语法如下
第1个参数requestCode,用来表示是哪一个子Activity的返回值
第2个参数resultCode用于表示子Activity的返回状态
第3个参数data是子Activity的返回数据,返回数据类型是Intent。根据返回数据的用途不同,Uri数据的协议则不同,也可以使用Extra方法返回一些原始类型的数据6.1 Intent6.1 Intent6.1.2 获取Activity返回值
在父Activity中获取返回值
下面代码说明如何在父Activity中处理子Activity的返回值6.1 Intent6.1 Intent6.1.2 获取Activity返回值
在父Activity中获取返回值
第1行代码和第12行代码是两个子Activity的请求码
第7行代码对请求码进行匹配
第9行和第11行代码对结果码进行判断
如果返回的结果码是Activity.RESULT_OK,则在代码的第10行使用getData()函数获取Intent中的Uri数据
如果返回的结果码是Activity.RESULT_CANCELED,则不进行任何操作6.1 Intent6.1 Intent6.1.2 获取Activity返回值
ActivityCommunication示例说明了如何以Sub-Activity方式启动子Activity,以及使用Intent进行组件间通信
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
当用户点击“启动Activity1”和“启动Activity2”按钮时,程序将分别启动子SubActivity1和SubActivity26.1 Intent6.1 Intent6.1.2 获取Activity返回值
SubActivity1提供了一个输入框,以及“接受”和“撤销”两个按钮
如果在输入框中输入信息后点击“接受”按钮,程序会把输入框中的信息传递给其父Activity,并在父Activity的界面上显示
如果用户点击“撤销”按钮,则程序不会向父Activity传递任何信息6.1 Intent6.1 Intent6.1.2 获取Activity返回值
SubActivity2主要是为了说明如何在父Activity中处理多个子Activity,因此仅提供了用于关闭SubActivity2的“关闭”按钮
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
ActivityCommunication文件结构6.1 Intent6.1 Intent6.1.2 获取Activity返回值
ActivityCommunication.java文件的核心代码如下
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
代码的第2行和第3行分别定义了两个子Activity的请求码
在代码的第16行和第23行以Sub-Activity的方式分别启动两个子Activity6.1 Intent6.1 Intent6.1.2 获取Activity返回值
代码第29行是子Activity关闭后的返回值处理函数,其中requestCode是子Activity返回的请求码,应该与第2行和第3行定义的两个请求码相匹配
resultCode是结果码,在代码第32行对结果码进行判断,如果等于RESULT_OK,在第35行代码获取子Activity的返回值中的数据
data是返回值,子Activity需要返回的数据就保存在data中
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
SubActivity1.java的核心代码如下
6.1 Intent6.1 Intent6.1.2 获取Activity返回值
第13行代码将EditText控件的内容作为数据保存在Uri中
第14行代码中使用这个Uri构造Intent
第15行代码中,将Intent作为返回值,RESUIT_OK作为结果码,通过调用setResult()函数,将返回值和结果码传递给父Activity
第16行代码调用finish()函数关闭当前的子Activity6.1 Intent6.1 Intent6.1.2 获取Activity返回值
SubActivity2.java的核心代码
第10行的setResult()函数仅设置了结果码,第2个参数为null,表示数据需要传递给父Activity6.2 Intent过滤器6.2 Intent过滤器Intent过滤器
Intent过滤器是一种根据Intent中的动作(Action)、类别(Categorie)和数据(Data)等内容,对适合接收该Intent的组件进行匹配和筛选的机制
Intent过滤器可以匹配数据类型、路径和协议,还包括可以用来确定多个匹配项顺序的优先级(Priority)
应用程序的Activity组件、Service组件和BroadcastReceiver都可以注册Intent过滤器,则这些组件在特定的数据格式上就可以产生相应的动作6.2 Intent过滤器6.2 Intent过滤器注册Intent过滤器
在AndroidManifest.xml文件的各个组件的节点下定义节点,然后在节点中声明该组件所支持的动作、执行的环境和数据格式等信息
在程序代码中动态地为组件设置Intent过滤器
节点支持标签、标签和标签
标签定义Intent过滤器的“类别”
标签定义Intent过滤器的“动作”
标签定义Intent过滤器的“数据”6.2 Intent过滤器6.2 Intent过滤器注册Intent过滤器
节点支持的标签和属性
标签用来指定Intent过滤器的服务方式,每个Intent过滤器可以定义多个标签,程序开发人员可使用自定义的类别,或使用Android系统提供的类别6.2 Intent过滤器6.2 Intent过滤器注册Intent过滤器
Android系统提供的类别
AndroidManifest.xml文件中的每个组件的都被解析成一个Intent过滤器对象。当应用程序安装到Android系统时,所有的组件和Intent过滤器都会注册到Android系统中。这样,Android系统便知道了如何将任意一个Intent请求通过Intent过滤器映射到相应的组件上6.2 Intent过滤器6.2 Intent过滤器Intent解析
Intent到Intent过滤器的映射过程称为“Intent解析”
Intent解析可以在所有的组件中,找到一个可以与请求的Intent达成最佳匹配的Intent过滤器
Intent解析的匹配规则
Android系统把所有应用程序包中的Intent过滤器集合在一起,形成一个完整的Intent过滤器列表
在Intent与Intent过滤器进行匹配时,Android系统会将列表中所有Intent过滤器的“动作”和“类别”与Intent进行匹配,任何不匹配的Intent过滤器都将被过滤掉。没有指定“动作”的Intent过滤器可以匹配任何的Intent,但是没有指定“类别”的Intent过滤器只能匹配没有“类别”的Intent
6.2 Intent过滤器6.2 Intent过滤器Intent解析
把Intent数据Uri的每个子部与Intent过滤器的标签中的属性进行匹配,如果标签指定了协议、主机名、路径名或MIME类型,那么这些属性都要与Intent的Uri数据部分进行匹配,任何不匹配的Intent过滤器均被过滤掉
如果Intent过滤器的匹配结果多于一个,则可以根据在标签中定义的优先级标签来对Intent过滤器进行排序,优先级最高的Intent过滤器将被选择
6.2 Intent过滤器6.2 Intent过滤器IntentResolutionDemo示例
IntentResolutionDemo示例说明了如何在AndroidManifest.xml文件中注册Intent过滤器,以及如何设置节点属性来捕获指定的Intent
AndroidManifest.xml的完整代码如下6.2 Intent过滤器6.2 Intent过滤器IntentResolutionDemo示例6.2 Intent过滤器6.2 Intent过滤器第7行代码和第14行代码分别定义了两个Activity
第9行到第12行是第1个Activity的Intent过滤器,动作是android.intent.action.MAIN,类别是android.intent.category.LAUNCHER。由过滤器的动作和类别可知,这个Activity是应用程序启动后显示的缺省用户界面
第16~20行是第2个Activity的Intent过滤器,过滤器的动作是android.intent.action.VIEW,表示根据Uri协议,以最佳的方式启动相应的Activity;类别是android.intent.category.DEFAULT,表示数据的默认动作;数据的协议部分是android:scheme="schemodemo",数据的主机名称部分是android:host="edu.hrbeu"
6.2 Intent过滤器6.2 Intent过滤器IntentResolutionDemo.java文件中Intent实例化和启动Activity的代码如下
第1行代码定义的Intent,动作为Intent.ACTION_VIEW,与Intent过滤器的动作android.intent.action.VIEW匹配;Uri是"schemodemo://edu.hrbeu/path",其中的协议部分为"schemodemo",主机名部分为"edu.hrbeu",也与Intent过滤器定义的数据要求完全匹配
代码第1行定义的Intent,在Android系统与Intent过滤器列表进行匹配时,会与AndroidManifest.xml文件中ActivityToStart定义的Intent过滤器完全匹配6.3 广播消息6.3 广播消息广播消息
Intent的另一种用途是发送广播消息
应用程序和Android系统都可以使用Intent发送广播消息
广播消息的内容可以与应用程序密切相关的数据信息,也可以Android的系统信息,例如网络连接变化、电池电量变化、接收到短信和系统设置变化等等
如果应用程序注册了BroadcastReceiver,则可以接收到指定的广播消息
6.3 广播消息6.3 广播消息广播信息的使用方法
创建一个Intent
注意:在构造Intent时必须用一个全局唯一的字符串标识其要执行的动作,通常使用应用程序包的名称
调用sendBroadcast()函数,就可把Intent携带的消息广播出去
如果要在Intent传递额外数据,可以用Intent的putExtra()方法6.3 广播消息6.3 广播消息利用Intent发送广播消息,并添加了额外的数据,然后调用sendBroadcast()发生了广播消息的代码6.3 广播消息6.3 广播消息BroadcastReceiver
BroadcastReceiver用于监听广播消息
可以在AndroidManifest.xml文件或在代码中注册一个BroadcastReceiver,并在其中使用Intent 过滤器指定要处理的广播消息
创建BroadcastReceiver需继承BroadcastReceiver类,并重载onReceive()方法。代码如下6.3 广播消息6.3 广播消息BroadcastReceiver的应用程序不需要一直运行,当Android系统接收到与之匹配的广播消息时,会自动启动此BroadcastReceiver
基于以上的特征,BroadcastReceiver适合做一些资源管理的工作
在BroadcastReceiver接收到与之匹配的广播消息后,onReceive()方法会被调用
onReceive()方法必须要在5秒钟执行完毕,否则Android系统会认为该组件失去响应,并提示用户强行关闭该组件
6.3 广播消息6.3 广播消息BroadcastReceiverDemo示例说明了如何在应用程序中注册BroadcastReceiver,并接收指定类型的广播消息
在点击“发生广播消息”按钮后,EditText控件中内容将以广播消息的形式发送出去,
示例内部的BroadcastReceiver将接收这个广播消息,并显示在用户界面的下方
6.3 广播消息6.3 广播消息BroadcastReceiverDemo.java文件中包含发送广播消息的代码,其关键代码如下
第3行代码创建Intent,将edu.hrbeu.BroadcastReceiverDem作为识别广播消息的字符串标识
第4行代码添加了额外信息
第5行代码调用sendBroadcast()函数发送广播消息
6.3 广播消息6.3 广播消息为了能够使应用程序中的BroadcastReceiver接收指定的广播消息,首先要在AndroidManifest.xml文件中添加Intent过滤器,声明BroadcastReceiver可以接收的广播消息
AndroidManifest.xml文件的完整代码如下6.3 广播消息6.3 广播消息
第14行代码中创建了一个节点
在第15行中声明了Intent过滤器的动作为“edu.hrbeu.BroadcastReceiverDemo”,这与BroadcastReceiverDemo.java文件中Intent的动作相一致,表明这个BroadcastReceiver可以接收动作为“edu.hrbeu.BroadcastReceiverDemo”的广播消息6.3 广播消息6.3 广播消息MyBroadcastReceiver.java文件创建了一个自定义的BroadcastReceiver,其核心代码如下
第1行代码首先继承了BroadcastReceiver类
第3行代码重载了onReveive()函数。当接收到AndroidManifest.xml文件定义的广播消息后,程序将自动调用onReveive()函数