Android----Intent详解

来源:互联网 发布:java面向对象基础题 编辑:程序博客网 时间:2024/05/21 07:04


1.Intent对于Android应用的作用

      大体可以分为两个功能:

      ① 封装Android应用程序需要启动某个组件的“意图”

      ② 作为应用组件之间的通信的媒介,将需要交换的数据封装成Bundle对象,然后使用Intent来携带Bundle对象

2.Intent对象详解

    2.1 使用Intent启动系统组件

             启动Activity:startActivity(Intent intent)

                                     startActivityForResult(Intent intent,int requestCode)

             启动Service:ComponentName startService(Intent intent)

                                       boolean bindService(Intent service,ServiceConnection conm,int flags)

             启动BroadcastReceiver:sendBroadcast(Intent intent)

                                                            sendBroadcast(Intent intent,String recePermission)etc

     2.2 Intent的属性及intent-filter配置

               Intent代表了Android应用启动一个应用的意图,Android应用将会根据Intent来启动指定组件,

       至于启动哪个组件,就需要根据不懂的属性值来判断。

               2.2.1 Component属性

                         首先介绍一个组件的概念:包括Service(服务),Activity(活动),Content(内容),

                         Intent(意图),BroadcastRece(广播),Notification(通知)

                         Intent的Component(成分)属性接受一个叫做ComponentName的值,ComponentName的结构器有:

                         Component(String pkg)//创建pkg所在包下的cls类所对应的所有组件

                         Component(String pkg,String cls)//创建pkg所对应的包下的cls类所对应的组件

                         Component(String pkg,Class<?> cls)//创建pkg所对应的包下的cls类所对应的组件

                         他们的都是根据包明和类名去确定一个组件 然后启动它

                         还可以通过Intent的setClass(Context package,Class<?> cls),setClassName(Context packageContext,String className)

                         setClassName(Strong packageName,String className)来指定该Intent要启动的组件

                         这种明确的指定启动哪个组件的叫做显式Intent 还有一种根据规则去启动和服规则的组件的叫做隐式Intent

                         for example

HelloWorld1.javaIntent intent = new Intent();ComponentName component = new ComponentName(HelloWorld1.this,HelloWorld2.class);intent.setComponent(component);startActivity(intent);HelloWorld2.javaComponentName component = getIntent().getComponent();//可以通过Intent获取Component的值

              2.2.2 Action、Category属性与intent-filter配置

                        Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象动作,而Category则用于

             为Action增加额外的附近类别信息。通常Action与Category属性会结合使用。

                        当一个Activity或者其他的组件的配置信息<intent-filter />中的Action和Category的值是多少。<intent-filter />通常包括0~N个<Action />子元素

             0~N个<Category />子元素 和 0~1个<data />子元素。这就是相当一个妹子要找嫩朋友的条件。

                        当Intent设置的Action和Category全部满足组件的Action和Category时,该组件就会被打开了,这就相当于一个男孩子完全满足了妹子找的

             条件后就在一起了。

                        一般来说,Intent一般只会指定一个Action,但是可以指定多个Category

             2.2.3 指定Action、Category调用系统Activity

                       Action和Category的对应表  点击打开链接

             2.2.4 Data、Type属性与intent-filter配置

             Data属性通常用于向Action属性提供操作数据,Data属性接受一个uri对象,uri通常通过如下形式的字符串来表示:

             

      content://com.android.contacts/contacts/1      tel:123
            uri字符串要满足如下格式:

            scheme://host:port/path

            content是scheme部分,com.android.contacts是host部分,port部分被省略,/contacts/1是path部分          

            Type属性用于指定该Data所指定uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,

            只要符合abc/xyz格式的字符串即可。

            Type和Data属性有时候会相互覆盖,例如:Intent先设置Data属性再设置Type属性,Tpye就会覆盖Data

             属性,反之亦然。解决方法就是设置调用setDataAndType()方法

             对应的,在AndroidMainifest.xml文件中通过<data />元素来设置Type,Data属性值

             <data />元素支持如下属性:

             mimeType:用于声明该组件所匹配的Intent的Type属性

             scheme:用于声明该组件所匹配Intent的Data属性的scheme部分

             data:用于声明该组件所匹配的Intent的Data属性的host部分

             host:用于声明该组件所匹配的Intent的Data属性的host部分

             port:用于声明该组件所匹配的Intent的Data属性的port部分

             path:用于声明该组件所匹配的Intent的Data属性的path部分

             pathPrefix:用于声明该组件所匹配的Intent的Data属性的path前缀

             pathPattern:用于声明该组件所匹配的Intent的Data属性的path字符串模板

             启动组件的时候Type必须完全符合,但是Intent的data值只设置了一部分,则只需要满足设置的那部分就能启动了。

             2.2.5 Extra属性

             Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bnudle对象,Bundle

             对象就是一个Map对象,可以存入多对key-value值

             2.2.6 Flag属性

             Flag属性用于为该Intent添加一些额外的控制旗杆,可以调用addFlags()方法来为Intent添加控制旗杆

             Flag属性的对应表 点击打开链接

   2.3 使用Intent创建Tab页面

            在不同的Tab页面下的content为一个Activity

    

TabHost tabHost = getTabHost();TabHost.addTab(tabHost.newTabSpec("tab1")                  .setIndicator("已接电话")                  .setContent(new Intent(this,HelloWorld1.class)                                   )                   );TabHost.addTab(tabHost.newTabSpec("tab2")                  .setIndicator("未接电话")                  .setContent(new Intent(this,HelloWorld2.class)                                   )                   );TabHost.addTab(tabHost.newTabSpec("tab3")                  .setIndicator("呼出电话")                  .setContent(new Intent(this,HelloWorld3.class)                                   )                   );


1 0
原创粉丝点击