一、Intent简介

  Android使用Intent来封装程序的调用“意图”,Activity、Service、BroadcastReceiver三种重要的组件都是依靠Intent来启动的,很明显使用Intent提供了一致的编程模型;使用Intent还有一个好处是,在某些时候应用程序只是想启动具有某些特征组件,并不想和某个具体的组件耦合,如果使用形如startActivity(Class activityClass)的方法来启动特定的组件,势必造成一种硬编码耦合,这样也不利于高层次的解耦。

  分类:

  显示意图:明确指定的目标组件的意图

    ---创建对象,Intent(Context context,Class calzz)

    ---何时使用,当操作当前自己应用的组件时使用

  隐式意图:没有明确指定目标组件的意图

    ---创建对象:Intent(String action)

    ---何时使用:当操作其他应用的组件时使用

二、Intent启动不同组建的方法

  Activity         :   startActivity(Intent intent)

               startActivityForResult(Intent intent,int requestCode)

   Service        :   ComponentName startService(Intent Service)

               boolean bindService(Intent Service,ServiceConnection,int flags)

   BroadcastReceiver    :  sendBroadcast(Intent intent)

              sendBroadcast(Intent intent,String receiverPermission)

              sendOrderedBroadcast(Intent intent,String receiverPermission)

              sendOrderedBroadcast(Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheduler,

                          int initialCode,String initialData,Bundle initialExtras)

              sendStickyBroadcast(Intent intent)

              sendStickyBroadcast(Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheduler,

                          int initialCode,String initialData,Bundle initialExtras)

三、Intent对象的属性

    Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动制定组件,至于具体启动哪个组件取决于Intent的各个属性。

    Intent属性大致包括:Component、Action、Category、Data、Type、Extra 、Flag;

    1、Component属性用于明确(显示启动)指定需要启动的目标组件;

    2、Action代表该Intent所要完成的一个抽象动作,这个动作具体由哪个组件来完成则取决于Activity的<intent-filter.../>配置,其属性的值是一个普通的字符串;需要注意的是一个Intent对象最多只能包括一个Action属性,设置Action属性的方法:setAction(MainActivity.KK_ACTION);。

    3、Category用于为Action增加额外的附加类别信息,通常会与Action属性结合使用,其属性值也是一个普通的字符串;一个Intent对象可以包括多个Category属性,程序可调用Intent的addCategory(String str)方法为Intent添加该属性。通过Intent调用Activity时,Android默认会自动添加CATEGORY_DEFAULT类别属性,故在Filter配置中CATEGORY_DEFAULT是不可缺少的;

    4、

    5、

    6、Extra属性用于“携带”需要交换的数据

    7、

  <intent-filter.../>元素里通常包含如下子元素:

    0~N个<action.../>子元素;

    0~N个<category.../>子元素;

    0~1个<data.../>子元素。

四、Action、Category与intent-filter配置

  1、创建一个Android工程时配置文件AndroidManifest.xml中的intent-filter标签中会自动生成两个子元素:

    <action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />;那么这两个子元素代表什么?

  我们都知道一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢?有些程序可能需要显示在程序列表里,有些不需要,该如何定义?首先,android.intent.action.MAIN决定应用程序最先启动的Activity, 其次由android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里,也就是说这两者是配合使用的。

  2、为什么加入android.intent.category.DEFAULT?

  每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 "android.intent.category.DEFAULT",所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 "android.intent.category.DEFAULT" category,不然将导致 Intent 匹配失败。一个 Intent 可以有多个 category,但至少会有一个,也是默认的一个 category。 只有 Intent 的所有 category 都匹配上,Activity 才会接收这个 Intent。

  3、getAction()与getCategories()

      String action=getIntent().getAction();   获取该Activity对应的Intent的Action属性
         Set<String> cates=getIntent().getCategories();  获取该Activity对应的Intent的Category属性

五、指定Action、Category调用系统Activity

  Intent代表了启动某个程序组件的意图,实际上Intent对象不仅可以启动本应用内程序组件,也可以启动Android系统的其他应用程序的组件,包括系统自带的程序组件(只要权限允许)。Android内部提供了大量标准的Action、Category常量,其中用于启动Activity的标准Action常量及对应的字符串如下:

  上述Action、Category常量在java文件中直接用即可,不需要在AndroidManifest.xml中配置。

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

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

      content://com.android.contacts/contacts/1(省略了port属性) 或  tel:123

    Uri字符串总满足如下格式:scheme://host:port/path

 2、 Type属性用于指定该Data属性所指定Uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz格式。

 3、 如果为Intent属性先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性,反之亦然;如果希望Intent即有Data属性,也有Type属性,则应该调用Intent的setDataAndType()方法。

  示例:

  public void overrideType(View source){
     
       Intent intent=new Intent();
       intent.setType("abc/xyz");
       intent.setData(Uri.parse("lee://www.fkjava.org:8888/test"));
       Toast.makeText(this, intent.toString(), Toast.LENGTH_LONG).show();
     }
    public void overrideData(View source){
     
       Intent intent=new Intent();     
       intent.setData(Uri.parse("lee://www.fkjava.org:8888/maypath"));
       intent.setType("abc/xyz");
       Toast.makeText(this, intent.toString(), Toast.LENGTH_LONG).show();
    }
    public void dataAndType(View source){
     
       Intent intent=new Intent();
       intent.setDataAndType(Uri.parse("lee://www.fkjava.org:8888/maypath"), "abc/xyz");
       Toast.makeText(this, intent.toString(), Toast.LENGTH_LONG).show();
    }

  运行结果截图:

  

 4、 在AndroidManifest.xml文件中为组件声明Data、Type属性都通过<data.../>元素,<data.../>元素格式如下:

    <data

        android:mimeType=""      ---用于声明该组件所能匹配的Intent的Type属性

        android:scheme=""        ---用于声明该组件所能匹配的Intent的Data属性的scheme部分

        android:host=""        ---用于声明该组件所能匹配的Intent的Data属性的host部分

        android:port=""        ---用于声明该组件所能匹配的Intent的Data属性的port部分

        android:path=""        ------用于声明该组件所能匹配的Intent的Data属性的path部分

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

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

       />

    为Intent指定Data属性时,并不要求被启动组件的<intent-filter.../>中<data.../>子元素的android:scheme、android:host、android:port、android:path完全满足。

5、使用Action、Data属性启动系统Activity

    一旦为Intent同时指定了Action、data属性,Android就可以根据指定的数据类型来启动特定的应用程序,并对指定数据执行相应的操作;

    eg.Action属性、Data属性的组合:

      ACTION_VIEW content://com.android.contacts/contacts/1     显示标识为1的联系人的信息 ;

      ACTION_EDIT content://com.android.contacts/contacts/1     编辑标识为1的联系人的信息

      ACTION_DIAL content://com.android.contacts/contacts/1     显示向标识为1的联系人拨号的界面 ;

      ACTION_VIEW tel:123     显示向指定号码123拨号的界面;

      ACTION_DIAL tel:123     显示向指定号码123拨号的界面;

      ACTION_VIEW content://contacts/people/:     显示所有联系人列表的信息,通过这种组合可以非常方便地查看系统联系人;

七、Extra属性

    该属性通常用于在多个Action之间进行数据的交换,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就是一个Map对象,可以存入多个键值对。

八、Flag属性

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

    常用Flag旗标如下:

      .FLAG_ACTIVITY_CLEAR_TOP  该Flag相当于加载模式中的singleTask,通过这种Flag启动的Activity将会把要启动的Activity之上的全部Activity弹出Activity栈;

      .FLAG_ACTIVITY_BROUGHT_TO_FRONT  如果通过该Flag启动的Activity已经存在,下次再启动的时候,只是将该Activity带到前台;

      .FLAG_ACTIVITY_NEW_TASK  默认的启动旗标,该旗标控制重新创建一个新的Activity;

      .FLAG_ACTIVITY_NO_ANIMATION 该旗标控制启动Activity时不使用过度动画;

      .FLAG_ACTIVITY_NO_HISTORY 该旗标控制被启动的Activity将不会保留在Activity栈中;

      .FLAG_ACTIVITY_REORDER_TO_FRONT 该Flag控制如果当前已有Activity,则直接将该Activity带到前台;

      .FLAG_ACTIVITY_SINGLE_TOP  相当于加载模式中的singleTop模式。

android-Intent and IntentFilter的更多相关文章

  1. Android Intent和IntentFilter详解与使用及实现系统“分享”接口

    Intent Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到 ...

  2. android Intent和IntentFilter

    android的应用程序包含三种重要的组件:Activity.Service.BroadcastReceiver,应用程序采用一致的方式来启动他们——都是依靠Intent来进行启动.Intent就封装 ...

  3. [转]android笔记--Intent和IntentFilter详解

    Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介. 使用Intent启动组件的优势1, Intent为组件的启 ...

  4. Android开发之隐式Intent中Intent-filter的三个属性-action,category,data

    使用隐式Intent时,需要使用到意图过滤器Intent-filter.Intent-filter含有三个属性:action,category,data.通过这三个属性的组合,可以启动想要启动的act ...

  5. android学习日记20--连接组件之Intent和IntentFilter

    上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...

  6. Android两个注意事项.深入了解Intent和IntentFilter(两)

    深入理解Intent和IntentFiler(二) 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)     在上一篇文章中,我们比較具体学习了&q ...

  7. Android应用程序组件之间的通信Intent和IntentFilter

    Android应用程序的基本组件,这些基本组建除了Content Provider之外,几乎全部都是依靠Intent对象来激活和通信的. 下面介绍Intent类,并通过例子来说明Intent一般用法 ...

  8. Android的Intent和IntentFilter应用说明一例

    很多人对文档中的Intent和IntentFilter不理解是什么意思,我这里举例解释下. Intent字面意思就是目标,目的.通俗一点,需要达成某些目标,则需要提供一些动作,这些目标的分类,以及达成 ...

  9. android笔记--Intent和IntentFilter详解

    本文转载自:https://www.cnblogs.com/liushengjie/archive/2012/08/30/2663066.html 本文转载自:https://www.cnblogs. ...

  10. android Intent介绍

    Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...

随机推荐

  1. HTML Entity Sets - All

    http://www.htmlentities.com/html/entities/ The view below displays the characters used in the offici ...

  2. Process32First 返回FALSE的原因

    一般情况下是不会返回FALSE的,如果发生了,请检查: 1:系统为UNICODE的,一定要设置PROCESSENTRY32的dwSize为sizeof(PROCESSENTRY32)即可..

  3. Java学习随笔5:Java多线程编程

    1. 线程是程序中单独顺序的控制流,线程本身依靠程序进行运行,线程是程序中的顺序控制流,只能使用分配给程序的资源和环境. 2. 进程是执行中的程序,一个进程可以包含一个或多个线程,但至少要包含一个线程 ...

  4. hive中大表join

    排序存储数据至BUCKETS,这样可以顺序进行join

  5. css整理-04 基本视觉格式化

    基本框 假定每一个元素都会生成一个火多个矩形框,为元素框 元素框中心有一个内容区,周围有内边距,边距和外边距 内容的背景会应用到内边距,外边距是透明的,可以看到父元素的背景 内边距不能是负值,外边距可 ...

  6. codefroces 589A

    time limit per testsecondsmemory limit per testmegabytesinputstandard inputoutputstandard outputPoly ...

  7. WPF,解决Listbox,按住ListboxItem向下拖出Listbox,横向滚动条跑到最后。

    类似这种样式的控件,.,在横向滚动条隐藏的情况下有这样的问题.(横向滚动条显示的时候也会,,目前不知道怎么解决.) 因为这个控件偏移是利用ListBox的ItemsPanelTemplate模版里的S ...

  8. 1.ARC和非ARC文件共存

    1.ARC和非ARC文件共存 项目->Build Parses->对应的类 1.1.新项目兼容老的非ARC:-fno-objc-arc 1.2.老项目兼容ARC:-fobjc-arc

  9. 线段树(区间操作) POJ 3325 Help with Intervals

    题目传送门 题意:四种集合的操作,对应区间的01,问最后存在集合存在的区间. 分析:U T [l, r]填充1; I T [0, l), (r, N]填充0; D T [l, r]填充0; C T[0 ...

  10. PLSQL看oracle中汉字显示乱码

    首先执行语句 select * from V$NLS_PARAMETERS  查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否为SIMPLIFIED CHINES ...