您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第6章Android消息与广播
第六章Android消息与广播本章目标:掌握Intent掌握Intent过滤器熟悉BroadcastReceive组件应用6.1IntentIntent是一个动作的完整描述,包含了动作的产生组件、接收组件和传递的数据信息。当然,也可以将Intent视为一个在不同组件之间传递的消息,这个消息在到达接收组件后,接收组件会执行相关的动作。由于Intent的存在,使得Android系统中相互独立的应用程序组件,成为了一个可以互相通信的组件集合。因此,无论这些组件是否在同一个应用程序中,Intent可以将一个组件的数据和动作传递给另一个组件。Intent为Activity、Service和BroadcastReceiver等组件提供交互能力。Intent的一个最常见的用途就是启动Activity和Service,另一个用途是在Android系统上发布广播消息。广播消息可以是接收的特定数据或者消息,也可以是手机的信号变化或电池的电量过低等信息。6.1IntentIntent是由组件名称、Action、Data、Category、Extra及Flag六部分组成的。接下来将分别对其进行详细介绍。组件名称实际上就是一个ComponentName对象,用于标识唯一的应用程序组件,即指明了期望的Intent组件,这种对象的名称是由目标组件的类名与目标组件的包名组合而成的。在Intent传递过程中,组件名称是一个可选项,当指定它时,便是显式的Intent消息,当不指定它时,Android系统则会根据其他信息及IntentFilter的过滤条件选择相应的组件。Action实际上就是一个描述了Intent所触发动作名称的字符串,在Intent类中,已经定义好很多字符串常量来表示不同的Action,当然,开发人员也可以自定义Action,其定义规则同样非常简单。6.1Intent系统定义的Action常量有很多,下面只列出其中一些较常用的以供参考。ACTION_CALL:拨出Data里封装的电话号码;ACTION_EDIT:打开Data里指定数据所对应的编辑程序;ACTION_VIEW:打开能够显示Data中封装的数据的应用程序;ACTION_MAIN:声明程序的入口,该Action并不会接收任何数据,同时结束后也不会返回任何数据;ACTION_BOOT_COMPLETED:BroadcastReceiverAction的常量,表明系统启动完毕;ACTION_TIME_CHANGED:BroadcastReceiverAction的常量,表明系统时间通过设置而改变。6.1IntentData主要是对Intent消息中数据的封装,主要描述Intent的动作所操作的数据的URI及类型。不同类型的Action会有不同的Data封装,例如打电话的Intent会封装tel:格式的电话URI,而ACTION_VIEW的Intent中的Data则会封装http:格式的URI。正确的Data封装对Intent匹配请求同样非常重要。Category是对目标组件类别信息的描述。同样作为一个字符串对象,一个Intent中可以包含多个Category。与Category相关的方法有三个,addCategory()添加一个Category,removeCategory()删除一个Category,而getCategory()得到一个Category。Android系统同样定义了一组静态字符常量来表示Intent的不同类型,下面列出一些常见的Category常量。6.1IntentCATEGORY_GADGET,表明目标Activity是可以嵌入到其他Activity中的;CATEGORY_HOME,表明目标Activity是HOMEActivity;CATEGORY_TAB,表明目标Activity是TabActivity的一个标签下的Activity;CATEGORY_LAUNCHER,表明目标Activity是应用程序中最先被执行的Activity;CATEGORY_PREFERNCE,表明目标Activity是一个偏好设置的Activity。Extra中封装了一些额外的附加信息,这些信息是以键值对的形式存在的。Intent可以通过putExtras()与getExtras()方法来存储和获取Extra。在Android系统的Intent类中,同样对一些常用的Extra键值进行定义。如下所示。EXTRA_BCC,装有邮件密送地址的字符串数组;EXTRA_EMAIL,装有邮件发送地址的字符串数组;EXTRA_UID,使用ACTION_UID_REMOVED动作时,描述删除用户的id;EXTRA_TEXT,当使用ACTION_SEND动作时,描述要发送文本的信息。Flag是指一些有关系统如何启动组件的标志位,Android同样对其进行了封装。6.1.1启动Activity在Android系统中,应用程序一般都有多个Activity,Intent可以实现不同Activity之间的切换和数据传递。Intent启动Activity方式可以分为显式启动和隐式启动。显式启动必须在Intent中指明启动的Activity所在的类,而隐式启动则由Android系统,根据Intent的动作和数据来决定启动哪一个Activity。也是说在隐式启动时,Intent中只包含需要执行的动作和所包含的数据,而无需指明具体启动那一个Activity,选择权由Android系统和最终用户来决定。使用Intent来显式启动Activity,首先需要创造一个Intent,并为它指定当前的应用程序上下文以及要启动的Activity,把创建好的这个Intent作为参数传递给startActivity()方法。具体格式如下:Intentintent=newIntent(IntentDemo.this,ActivityToStart.class);startActivity(intent);6.1.1启动Activity隐式启动的好处在于不需要指明要启动那一个Activity,而由Android系统来决定,这样有利于使用第三方组件。隐式启动Activity时,Android系统在应用程序运行时解析Intent,并根据一定的规则对Intent和Activity进行配置,使Intent上的动作、数据与Activity完全吻合。匹配的Activity可以是应用程序本身的,也可以是Android系统内置的,还可以是第三方应用程序提供的。因此,这种方式更加强调了Android应用程序中组件的可复用性。在默认情况下,Android系统会调用内置的Web浏览器。如下一个访问百度网页的小例子代码。Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse());startActivity(intent);Intent的动作是Intent.ACTION_VIEW,根据URI的数据类型来匹配动作。数据部分的URI是Web地址,使用Uri.parse(urIString)方法,可以简单地把一个字符串解释成Uri对象。Intent的语法如下:Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse(urlString));6.1.1启动Activity表6-1Intent常用动作表动作说明ACTION_ANSWER打开接听电话的Activity,默认为Android内置的拨号盘界面ACTION_CALL打开拨号盘界面并拨打电话,使用Uri中的数字部分为电话号码ACTION_DELETE打开一个Activity,对所提供的数据进行删除操作ACTION_DIAL打开内置拨号盘界面,显示Uri中提供的电话号码ACTION_EDIT打开一个Activity,对提供的数据进行编辑操作ACTION_INSERT打开一个Activity,在提供的数据的当前位置插入新项ACTION_PICK启动一个子Activity,从提供的数据列表中选取一项ACTION_SEARCH启动一个Activity,执行搜索动作ACTION_SENDTO启动一个Activity,向数据提供的联系人发送信息ACTION_SEND启动一个可以发送数据的ActivityACTION_VIEW最常用的动作,对以Uri方式传送的数据,根据Uri协议部分以最佳方式启动相应的Activity进行处理。对于http:address将打开浏览器查看:对于tel:address将打开拨号呼叫指定的电话号码ACTION_WEB_SERCH打开一个Activity,对提供的数据进行Web搜索6.1.2获取Activity返回值在很多情况下,后启动的Activity是为了让用户对特定信息进行选择,在关闭这个Activity后,用户的选择信息需要返回给未关闭的那个Activity。按照Activity启动的先后顺序,先启动的称为父Activity,后启动的称为子Activity。如果需要将子Activity的部分信息返回给父Activity,则可以使用Sub-Activity的方式去启动子Activity。获取子Activity的返回值,一般可以分为以下三个步骤:以Sub-Activity的方式启动子Activity。设置子Activity的返回值。在父Activity中获取返回值。下面详细介绍每一个步骤的过程和代码实现。6.1.2获取Activity返回值以Sub-Activity的方式启动子Activity以Sub-Activity方式启动子Activity,需要调用startActivityForResult(Intent,requestCode),参数Intent用于启动哪个Activity,参数requestCode是唯一的标识子Activity的请求码。因为所有子Activity返回时,父Activity都调用相同的处理函数,因此父Activity使用requestCode来确定是哪一个子Activity的返回值。显式启动子Activity的代码如下:intSUBACTIVITY1=1;Intentintent=newIntent(this,SubActivity1.class);startActivityForResult(intent,SUBACTIVITY1);隐式启动子Activity的代码如下:intSUBACTIVITY2=2;Uriuri=Uri.parse(content://contacts/people);Intentintent=newIntent(Intent.ACTION_PICK,uri);startActivityForResult(intent,SUBACTIVITY2);6.1.2获取Activity返回值设置子Activity的返回值在子Activity调用finish()函数关闭前,调用setResult()函数将所需的数据返回给父Activity。setResult()函数有两个参数,一个是结果码,一个是返回值。结果码表明了子Activity的返回状态,通常为Activity.RESULT_OK或者Activity.RESULT_CANCELED,也可以是自定义的结果码,结果码均为整数类型。返回值封装在Intent中,也就是说子Activity通过Intent将需要返回的数据传递给父Activity。数据主要以Uri形式提供的返回给父Activity,此外还可以附加一些额外信息,这些额外信息用Extra的集合表示。以下代码说明如何在子Activity中设置返回值:Uridata=Uri.parse(tel:+tel_number);Intentresult=newIntent(null,d
本文标题:第6章Android消息与广播
链接地址:https://www.777doc.com/doc-2197105 .html