
第五章Android的Intent和Broadcast.ppt
12页第五章Intent和BroadcastAndroid课件Android应用程序的核心---Intent一、一、Intent是什么?是什么?Intent是是Android的灵魂,程序跳转和传递数据的时候基本上就是靠的灵魂,程序跳转和传递数据的时候基本上就是靠Intent,理解,理解Intent对应用编对应用编程很有帮助,在程很有帮助,在Android的官方的官方API里,对里,对Intent的定义为:的定义为:An Intent is an abstract description of an operation to be performed即一个Intent就是一个对将要执行的操作就是一个对将要执行的操作的抽象的描述具有以下三种形式:的抽象的描述具有以下三种形式:1)通过)通过startActivity(intent)方法来启动一个新的方法来启动一个新的Activity;;2)通过)通过broadcast Intent机制可以将一个机制可以将一个Intent发送给任何对这个发送给任何对这个Intent感兴趣的感兴趣的BroadcastReceiver3)通过)通过startService(Intent)或者或者bindService(Intent,ServiceConnection,int)来和后台的来和后台的Service进行交互。
进行交互关于广播关于广播Broadcast和服务和服务Service部分后面再讲部分后面再讲一)用(一)用Intent启动一个新的启动一个新的ActivityIntent最常用的用途就是连接一个应用当中的各个最常用的用途就是连接一个应用当中的各个Activity,如果我们把,如果我们把Activity比作积木的话,比作积木的话,那么那么Intent就好像是胶水,把不同的积木粘起来,构成我们搭建的房子在程序当中如果要就好像是胶水,把不同的积木粘起来,构成我们搭建的房子在程序当中如果要启动一个启动一个Activity的话,通常我们会调用的话,通常我们会调用startActivity方法,并把方法,并把Intent作为参数传递进去,作为参数传递进去,代码如:代码如:startActivity(myIntent);这个这个Intent或者指定了一个或者指定了一个Activity,或者里边只包含了选定,或者里边只包含了选定Activity的信息,但是具体启动哪个的信息,但是具体启动哪个Activity由系统去决定,由系统去决定,Android的系统负责挑选一个最满足匹配挑选条件的的系统负责挑选一个最满足匹配挑选条件的Activity。
Android应用程序的核心---Intent1、启动一个特定的、启动一个特定的Activity启动一个特定的启动一个特定的Activity是非常简单的事,只需要将当前是非常简单的事,只需要将当前Context和这个和这个Activity的的class作为参作为参数构造数构造Intent,然后再将这个,然后再将这个Intent作为参数传递给作为参数传递给startActivity方法即可,代码如下:方法即可,代码如下:Intent intent = new Intent(CurrentActivity.this,OtherActivity.class);startActivity(intent);当执行了当执行了startActivity(intent)方法后,一个新的方法后,一个新的Activity就会被创建,并且移到整个就会被创建,并且移到整个Activity的的堆栈顶部堆栈顶部2、启动一个未指明的、启动一个未指明的Activity在程序当中很多时候我们并不去关心启动哪个在程序当中很多时候我们并不去关心启动哪个Activity,而是将我们想启动的那个,而是将我们想启动的那个Activity的描的描述信息放置到述信息放置到Intent里边,然后让系统去寻找和匹配合适的里边,然后让系统去寻找和匹配合适的Activity来启动,这样做是非常有来启动,这样做是非常有好处的。
比如对于第三方的好处的比如对于第三方的Activity,它只描述自己在什么情况下被执行,如果我们启动,它只描述自己在什么情况下被执行,如果我们启动Activity的描述信息正好和第三方的描述信息正好和第三方Activity的描述相匹配,那么这个第三方的的描述相匹配,那么这个第三方的Activity就被启就被启动了代码如下:动了代码如下:Intent intent=new Intent(Intent.ACTION_DIAL,Uri.parse(“tel:115-1345:));startActivity((intent);我们并没有指定哪个我们并没有指定哪个Activity去执行,只是把我们对启动去执行,只是把我们对启动Activity的描述信息放到的描述信息放到Intent当中,那当中,那么当执行么当执行startActivity((intent)方法后,方法后,Android系统会自动寻找,到底哪个系统会自动寻找,到底哪个Activity最合适最后它根据描述信息找到处理最后它根据描述信息找到处理Activity,然后启动,执行然后启动,执行Android应用程序的核心---Intent3、处理一个、处理一个Activity的返回值的返回值前面两种启动前面两种启动Activity没有返回值,即这两种方式启动完没有返回值,即这两种方式启动完Activity,执行完后,不会返回数据给,执行完后,不会返回数据给前一个前一个Activity。
所以所以Android提供了另外一种方式来处理这种需要返回数据的方法提供了另外一种方式来处理这种需要返回数据的方法startActivityForResult(Intent)方法用于启动一个方法用于启动一个Activity并且新的并且新的Activity执行完后需要返回到执行完后需要返回到启动它的启动它的Activity来执行回调函数如:来执行回调函数如:qpublic void onClick(View v) {qIntent intent1 = new Intent(ActivityMain.this, Activity1.class);qintent1.putExtra("activityMain", "数据来自数据来自activityMain");q//下面方法的下面方法的REQUEST_CODE值传递给了值传递给了onActivityResult(REQUEST_CODE, RESULT_OK, Intent data)方法方法qstartActivityForResult(intent1, REQUEST_CODE);q}q@Overrideq //当本类通过当本类通过Intent1启动的启动的Activity1结束时下面的方法开始调用结束时下面的方法开始调用qprotected void onActivityResult(int requestCode, int resultCode, Intent data) {qif (requestCode == REQUEST_CODE) {qif (resultCode == RESULT_CANCELED)qsetTitle("取消取消");qelse if (resultCode == RESULT_OK) {qString temp=null;q//取回从取回从Activity1返回的名值返回的名值q Bundle extras = data.getExtras();q if (extras != null) {q temp = extras.getString("store");q }qsetTitle(temp);q}q}q}我们通过我们通过startActivityForResult(intent1, REQUEST_CODE)来启动了来启动了Activity1,意味着在,意味着在Activity1执行完毕后,要把相关的数据返回给启执行完毕后,要把相关的数据返回给启动动Activity1的的Activity,返回的数据处理是通过重,返回的数据处理是通过重写写Activity中的中的onActivityResult(int requestCode, int resultCode, Intent data) 实现实现的,当被启动的的,当被启动的Activity1执行完毕的时候,执行完毕的时候,Android系统自动会调用这个方法。
系统自动会调用这个方法Android应用程序的核心---Intent4、、Intent详解详解在在Android参考文件中,对参考文件中,对Intent的定义是执行某操作的一个抽象描述(确实很抽象)进一步的定义是执行某操作的一个抽象描述(确实很抽象)进一步分析研究,对分析研究,对Intent即将启动的操作的抽象描述内容归纳如下:即将启动的操作的抽象描述内容归纳如下:1)对执行动作的描述:操作()对执行动作的描述:操作(Action)2)对于这次动作相关的数据进行描述:数据()对于这次动作相关的数据进行描述:数据(data)3)对于数据类型进行描述:数据类型()对于数据类型进行描述:数据类型(type)4)对执行动作的附加信息的描述:附加信息()对执行动作的附加信息的描述:附加信息(category)5)其他一切附加信息的描述:附加信息()其他一切附加信息的描述:附加信息(extras)6)对目标组件的描述:目标组件()对目标组件的描述:目标组件(component)5、、Android自带的自带的Action介绍介绍Android系统自定义很多标准系统自定义很多标准Action,如,如ACTION_MAIN,,ACTION_VIEW,下面介绍经常用,下面介绍经常用到的标准动作。
到的标准动作ACTION_MAIN:它的值我们比较熟悉::它的值我们比较熟悉:“android.intent.action.MAIN”,这个值我们在每个,这个值我们在每个AndroidManifest.xml当中都可以看到它标记一当前当中都可以看到它标记一当前Activity作为一个程序的入口作为一个程序的入口ACTION_VIEW:将数据显示给用户将数据显示给用户ACTION_VIEW通常和特定的通常和特定的data相配合使用,用于给用相配合使用,用于给用户显示数据户显示数据ACTION_DIAL:用于描述给用户打的动作,通常和:用于描述给用户打的动作,通常和data配合使用将会触发给特定配合使用将会触发给特定data的用的用户打ACTION_PICK:从特定的一组数据中进行选择数据操作从特定的一组数据中进行选择数据操作ACTION_EDIT:编辑特定的数据编辑特定的数据ACTION_DELETE:删除特定的数据删除特定的数据Android应用程序的核心---Intent5、与动作(、与动作(Action)相关联的数据()相关联的数据(data)介绍)介绍Android中用指向数据的一个中用指向数据的一个URI来表示数据来表示数据data,例如在联系人中,一个指向某联系人的,例如在联系人中,一个指向某联系人的URI可能为:可能为:content://contacts/1。
这种这种URI表示,通过表示,通过ContentURI这个类描述,具体可以参考这个类描述,具体可以参考.ContentURI类的文档类的文档以联系人为例,以下是一些以联系人为例,以下是一些action/data对,以及他们要表达的意图:对,以及他们要表达的意图:**VIEW_ACTION content://contacts/1 显示标识符为显示标识符为“1”的联系人的详细信息;的联系人的详细信息;**EDIT_ACTION content://contacts/1 编辑标识符为编辑标识符为“1”的联系人的详细信息;的联系人的详细信息;**VIEW_ACTION content://contacts/ 显示所有联系人的详细信息列表;显示所有联系人的详细信息列表;**PICK_ACTION content://contacts/ 显示所有联系人的详细信息列表,并且允许用户在列表中选择一个联系显示所有联系人的详细信息列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父人,然后把这个联系人返回给父Activity,例如,电子邮件客户端可以使用这个,例如,电子邮件客户端可以使用这个Intent,要求用户在联系,要求用户在联系人列表中选择联系人。
人列表中选择联系人6、、Intent中其他属性介绍中其他属性介绍Action中大多数情况下只包含上面介绍的中大多数情况下只包含上面介绍的Action和和Data属性,但是有时候还会包括下边的属性属性,但是有时候还会包括下边的属性类别(类别(categroy),它为执行动作的附加信息例如,它为执行动作的附加信息例如LAUNCHER_CATEGORY表示表示Intent的接受者应该在的接受者应该在launcher中作为顶级应用出现:而中作为顶级应用出现:而ALTERNATIVE_CATEGORY表示当前的表示当前的Intent是一系列的可选动作中是一系列的可选动作中的一个数据类型(数据类型(type)),显示指定显示指定Intent的数据类型(的数据类型(MIME)一般Intent的数据类型能够根据数据本身进行判的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显示指定的类型而不再进行指导定,但是通过设置这个属性,可以强制采用显示指定的类型而不再进行指导组件(组件(component),),指定指定Intent的目标组件的类名称通常会根据的目标组件的类名称通常会根据Intent中包含的其他属性的信息如中包含的其他属性的信息如action,,data/type,,category进行查找,最终找到一个与之匹配的目标组件。
但是如果进行查找,最终找到一个与之匹配的目标组件但是如果component这个这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程附加信息(附加信息(extras),),是其他所有附加信息的集合使用是其他所有附加信息的集合使用extras可以为组件提供扩展信息,例如,如果要执可以为组件提供扩展信息,例如,如果要执行行“发送电子邮件发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件里,传给电子邮件发送组件总之总之,action、、data/type、、category和和extras一起形成了一种级别的语言规范这种语言使系统能够理解诸如一起形成了一种级别的语言规范这种语言使系统能够理解诸如“查看某联系人的详细信息查看某联系人的详细信息”或者或者“给某人打给某人打”之类的短语随着应用不断地加入到系统,之类的短语随着应用不断地加入到系统,Android系统可以添加新的系统可以添加新的action、、data/type、、category来扩展这种语言。
当然最受益的还是应用本身,我们可来扩展这种语言当然最受益的还是应用本身,我们可以利用这套语言机制来处理不同的动作和数据以利用这套语言机制来处理不同的动作和数据Android应用程序的核心---Intent7、、Android解析解析Intent实现实现在应用中,我们可以有两种形式来使用在应用中,我们可以有两种形式来使用Intent1))直接直接Intent:指定了:指定了component属性的属性的Intent(调用(调用setComponent(ComponentName))或者或者setClass(Context,Class)来指定)通过指定具体的组件类,通知应用启动对应的组来指定)通过指定具体的组件类,通知应用启动对应的组件2))间接间接intent:没有指定:没有指定component属性的属性的Intent这些这些Intent需要包含足够的信息,这样系需要包含足够的信息,这样系统才能根据这些信息,在所有的可用组件中,确定满足此统才能根据这些信息,在所有的可用组件中,确定满足此Intent的组件对于直接对于直接Intent,,Android不需要去做解析,因为目标组件已经明确,不需要去做解析,因为目标组件已经明确,Android需要解析的是那需要解析的是那些间接些间接Intent,通过解析,将,通过解析,将Intent映射给处理此映射给处理此Intent的的Activity、、Receiver、或、或Service。
Intent解析机制主要是通过查找已经注册在解析机制主要是通过查找已经注册在AndroidManifest.xml中的所有中的所有IntentFilter以及以及其中定义的其中定义的Intent,最终找到匹配的,最终找到匹配的Intent在这个解析过程中,在这个解析过程中,Android是通过是通过Intent的的action、、type、、category这这3个属性来进行判断的,个属性来进行判断的,判断方法如下:判断方法如下:1)如果)如果Intent指明定了指明定了action,则目标组件的,则目标组件的IntentFilter的的action类表中就必须包含这个类表中就必须包含这个action,否则不能匹配否则不能匹配2)如果)如果Intent没有提供没有提供type,系统将从,系统将从data中得到数据类型和中得到数据类型和action一样,目标组件的数据一样,目标组件的数据类型列表中必须包含类型列表中必须包含Intent的数据类型,否则不能匹配的数据类型,否则不能匹配3)如果)如果Intent中的数据不是具体的内容而是中的数据不是具体的内容而是URI形式的话,则将根据形式的话,则将根据Intent中数据的中数据的scheme(如(如http:或或mailto:)进行匹配。
同上进行匹配Intent的的scheme必须出现在目标组件的类别列表中必须出现在目标组件的类别列表中4)如果)如果Intent指定了一个或多个指定了一个或多个category,这些类别必须全部出现在组件的类别类表中,如,这些类别必须全部出现在组件的类别类表中,如Intent中包含了两个类别:中包含了两个类别:LAUNCHER_CATEGORY和和ALTERNATIVE_CATEGORY,解,解析得到的目标组件必须至少包含这两个类别析得到的目标组件必须至少包含这两个类别 Android应用程序的核心---Intentq举例说明:举例说明:qq
动作,是应用的入口动作(Action)为为“android.intent.action.Main”,表示表示ActivityMain为应用中的第一个为应用中的第一个Activity类别(category)为为”android.intent.categpry.LAUNCHER”,表,表示当前程序启动时,示当前程序启动时,ActivityMain会被放在启动会被放在启动Activity堆栈的顶层还有堆栈的顶层还有一个一个Activity是是ActivityAuthSuccess,动作动作(Action)为为“android.intent.VIEW”,类别(类别(category)分别为缺省类型)分别为缺省类型“android.intent.category.DEFAULT”,,“android.intent.category.BROWSABLE”类型,此类型表明类型,此类型表明ActivityAuthSuccess可以通过浏览器启动需要注意的是我们在这里定可以通过浏览器启动需要注意的是我们在这里定义了数据类型的匹配模式为义了数据类型的匹配模式为scheme=“haiyang”,也就是说当连接为,也就是说当连接为”haiyang://”模式的时候可以触发模式的时候可以触发ActivityAuthSuccess这个这个Activity。
利用Intent来广播事件--BroadCast前面学习的前面学习的Intent主要是用来启动主要是用来启动Activity,但是,但是Intent的作用远远不止这些的作用远远不止这些Intent还有几个还有几个重要的机制,其中一个就是作为不同进程间传递数据和事件的媒介重要的机制,其中一个就是作为不同进程间传递数据和事件的媒介通常我们自己的应用或者是通常我们自己的应用或者是Android系统本身在某些事件来临时会将系统本身在某些事件来临时会将Intent广播出去,而注册的广播出去,而注册的Boradcast Receiver可以监听这些可以监听这些Intent,并且可以获得保存在,并且可以获得保存在Intent里面的数据这一点里面的数据这一点很有用的很有用的例如在电池电量发生变化网络连接发生变化的时候或者来电、来短信的时候,例如在电池电量发生变化网络连接发生变化的时候或者来电、来短信的时候,Android系统系统都会将相关的都会将相关的Intent进行广播如果注册了针对这些事件的进行广播如果注册了针对这些事件的Broadcast Receiver,那么就可,那么就可以处理这些事件以处理这些事件。
一、实现一、实现Android中的时间广播中的时间广播程序主广播程序主广播Intent是比较简单的在程序当中只要构造好一个是比较简单的在程序当中只要构造好一个Intent,然后调用,然后调用sendBroadcast进行广播即可如下面的代码进行广播即可如下面的代码public static final String NEW_BROADCAST=“.action.NEW_BROADCAST”; Intent intent=new Intent(NEW_BROADCAST); intent.puExtra(“data1”,somedata); intent.puExtra(“data2”,somedata);sendBroadcast(intent);二、二、BroadCast Receiver介绍介绍不管是系统广播的不管是系统广播的Intent还是其他程序广播的还是其他程序广播的Intent,如果要想接收并且对它处理的话,需要注,如果要想接收并且对它处理的话,需要注册一个册一个Broadcast Receiver,并且一般的要给注册的这个,并且一般的要给注册的这个Broadcast Receiver设置一个设置一个Intent Filter来定制当前的来定制当前的Broadcast Receiver是对那些是对那些Intent进行监听。
进行监听 利用Intent来广播事件--BroadCast三、如何实现一个三、如何实现一个BroadCast Receiver很简单,就是继承很简单,就是继承BroadcastReceiver类,并重写这个类当中的类,并重写这个类当中的onReceiver()方法来实现代码如下所示:方法来实现代码如下所示: public class MyAndroidReceiver extends BroadcastReceiver{ @Override public void onReceiver(Context context,Intent intent){ //这里写代码这里写代码 }}在在onReceiver()方法里面最好不要有执行方法里面最好不要有执行5s的代码,如果这样的话,的代码,如果这样的话,Android系统会弹出一个超时对话框一般对于一个耗时系统会弹出一个超时对话框一般对于一个耗时的方法是写在一个线程里面的,单独来执行的方法是写在一个线程里面的,单独来执行注册的注册的BroadcastReceiver并非一直在后台运行,而是当事件或者相关的并非一直在后台运行,而是当事件或者相关的Intent来临时后,才会被系统调用。
有了这套广播机来临时后,才会被系统调用有了这套广播机制,我们就可以写一些和事件处理相关的程序了制,我们就可以写一些和事件处理相关的程序了四、如何注册和注销一个四、如何注册和注销一个BroadCast Receiver实现了自己的实现了自己的BroadcastReceiver后还必须注册才能应用,有两种方式对后还必须注册才能应用,有两种方式对BroadcastReceiver进行注册进行注册1)在)在AndroidManifest.xml文件当中进行注册,这种方法是比较好的,而且是最经常用的方式文件当中进行注册,这种方法是比较好的,而且是最经常用的方式q
