美文网首页
十九、Intent和IntentFilter介绍

十九、Intent和IntentFilter介绍

作者: 清梦星河哈 | 来源:发表于2019-07-22 16:37 被阅读0次

    1.使用Intent启动系统组件

    Android的应用包含三种重要组件:Activity、Service、BroadcastRecevier,应用程序采用了一致的方式来启动它们--Intent,Intent就是封装了程序想要启动程序的意图,不仅如此,Intent还可以用于被启动组件交换信息。

    组件类型 启动方法
    Activity startActivity(); startActivityForResult();
    Service startstartActivity(); bindService();
    BroadcastRecevier sendBroadcast();........

    2.Action、Category属性与intent-filter配置

    Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所以完成的一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息。通常Action属性会与Category属性结合使用。
    Action要完成的只是一个抽象动作,这个动作具体由哪个组件(或者是Activity、BroadcastReceiver)来完成,Action这个字符串本身并不管。比如Android提供的标准Action:Intent.ACTION_VIEW,它只表示一个抽象的查看操作,但具体查看什么、启动哪个Activity来查看,Intent.ACTION_VIEW并不知道----这取决于Activity的<intent-filter.../>的配置,只要某个Activity的<intent-filter.../>配置中包含了该ACTION_VIEW,该Activity就有可能被启动。

    下面就通过一个简单的的示例来示范Action的属性(普通字符串)作用。

    public final static String CRAZYIT_ACTION = "org.crazyit.intent.action.CRAZYIT_ACTION";
    
    Intent intent = new Intent();
    //为intent设置Action属性(属性值就是普通字符串)
    intent.setAction(CRAZYIT_ACTION);
    startActivity(intent);
    

    那么到底会启动哪个Activity呢?这取决于Activity配置中的<intent-filter.../>元素的配置。<intent-filter.../>元素是AndroidManifest.xml文件中<activity...../>元素的子元素。
    <intent-filter.../>元素里通常可包含如下子元素:

    0~n个<action..../>子元素
    0~n个<category..../>子元素
    0~1个<data..../>子元素

    <action..../><category..../>子元素的配置非常简单,它们都可以指定androidname属性该属性的值就是一个普通字符串。
    当<activity...../>元素里的<intent-filter.../>子元素里包含多个<action..../>子元素时,就表明该Activity能相应Action属性值为其中任意一个字符串的Intent。
    由于上面的程序指定启动Action属性为CRAZYIT_ACTION常量的Activity,也就要求被启动Activity对应的配置元素的<intent-filter.../>元素里至少包含一个如下的<action..../>子元素:

    <action android:name="org.crazyit.intent.action.CRAZYIT_ACTION"/>
    

    需要指出的是,一个 Intent对象最多只能包括一个 Action属性,程序可调用 Intent的setAction( String str)方法来设置 Action属性值;但一个 Intent对象可以包含多个 Category 属性,程序可调用 Intent 的 addCategory( String str)方法来为 Intent i添加 Category属性。当程序创建Intent时,该 Intent默认启动 Category属性值为 Intent.CATEGORY_DEFAULT常量(常量值为 android.intent.category. DEFAULT)的组件。

    因此,虽然上面程序的粗体字代码并未指定目标的 Intent的 Category属性,但该 Intent已有一个值为android.Intent.category.DEFAULT的Category属性值,因此被启动Activity对应的配置元素的<intent-filter.>元素里至少还包括一个如下的< category../>子元素:

    <category android:name="android.Intent.category.DEFAULT"/>
    

    3.指定Action、Category调用系统Activity

    实际上 Android内部提供了大量标准 Action、Category常量,其中用于启动 Activity的标准 Action常量及对应的字符串如表所示

    启动Activity的标准Action

    Action常量 对应字符串 简单说明
    ACTION_MAIN android.intent.action.MAIN 应用程序入口
    ACTION_VIEW android.intent.action.VIEW 显示指定数据
    ACTION_ATTACH_DATA android.intent.action.ATTACH_DATA 指定某块数据将被附加到其他地方
    ACTION_EDIT android.intent.action.EDIT 编辑指定数据
    ACTION_PICK android.intent.action.PICK 从列表中选择某项并返回所选的
    ACTION_CHOOSER android.intent.action.CHOOSER 显示一个 Activity选择器
    ACTION_GET_CONTENT android.intent.action.GET_CONTENT 让用户选择数据,并返回所选数据
    ACTION_DIAL android.intent.action.DIAL 显示拨号面板
    ACTION_CALL android.intent.action.CALL 直接向指定用户打电话
    ACTION_SEND android.intent.action.SEND 向其他人发送数据
    ACTION_SENDTO android.intent.action.SENDTO 向其他人发送消息
    ACTION_ANSWER android.intent.action.ANSWER 应答电话
    ACTION_INSER android.intent.action.INSER 插入数据
    ACTION_DELETE android.intent.action.DELETE 删除数据
    ACTION_RUN android.intent.action.RUN 运行数据
    ACTION_SYNC android.intent.action.SYNC 执行数据同步
    ACTION_PICK_ACTMITY android.intent.action.PICK_ACTMITY 用于选择 Actvity
    ACTION_SEARCH android.intent.action.SEARCH 执行搜索
    ACTION_WEB_SEARCH android.intent.action.WEB_SEARCH 执行Web搜索
    ACTION_FACTORY_TEST android.intent.action.FACTORY_TEST 工厂测试的入口点

    Category常量及对应字符串

    Category常量 对应字符串 简单说明
    CATEGORY_DEFAULT android.intent.category.DEFAULT 默认的Category
    CATEGORY_BROWSABLE android.intent.category.BROWSABLE 指定该 Activity能被浏览器安全调用
    CATEGORY_TAB android.intent.category.TAB 指定 Activity作为Tabactivity的Tab页
    CATEGORY_LAUNCHER android.intent.category.LAUNCHER 显示顶级程序列表中
    CATEGORY_INFO android.intent.category.INFO 用于提供包信息
    CATEGORY_HOME android.intent.category.HOME 设置该 Activity随系统启动而运行
    CATEGORY_PREFERENCE android.intent.category.PREFERENCE 设置该 Activity是参数面板
    CATEGORY_TEST android.intent.category.TEST 该 Activity是一个测试
    CATEGORY_CAR_DOCK android.intent.category.CAR_DOCK 指定手机被插入汽车底座(硬件)时运行该Activity
    CATEGORY_DESK_DOCK android.intent.category.DESK_DOCK 指定手机被插入桌面底座(硬件)时运行该Activity
    CATEGORY_CAR_MODE android.intent.category.CAR_MODE 设置该Activity可在车载环域下使用
    以上只是部分常量,详细看Android API

    4.Data、Type属性与intent-filter配置

    Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象。
    Type属性则用于明确指定Data属性所指的类型或MIME类型,通常来说当Intent不指定Data属性时Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无须指定Type属性。

    常用拨号、浏览网页

    Uri uri = Uri.parse("tel:13800138000");
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_DIAL);
    intent.setData(uri);
    startActivity(intent);
    
    Uri uri = Uri.parse("https://www.baidu.com");
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(uri);
    startActivity(intent);
    

    5.Extra属性

    Intent属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,它可以存入多组key-value对,这就可以通过Intent在不同Activity交换数据了。

    相关文章

      网友评论

          本文标题:十九、Intent和IntentFilter介绍

          本文链接:https://www.haomeiwen.com/subject/kwyilctx.html