Intent

作者: _Rice_ | 来源:发表于2018-10-16 11:48 被阅读0次

    推荐阅读:Intent详解

    Intent是消息传递对象,协助组件之间的通信,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互

    一、Intent有两种类型

    1、显式Intent

    指定特定组件,通过ComponentName直接设置需要调用的Activity对象

    Intent intent = new Intent(this, SecondActivity.class);  
    startActivity(intent); 
    

    2、隐式Intent

    不指定特定组件,而是设置Action、Data、Category,让系统来筛选出合适的组件。

    原理分析:


    image.png
    • Activity A创建Intent带有操作描述并将其传递给startActivity

    • Android系统在所有应用中manifest文件中声明的intent过滤器进行比较来找到适当的组件。如果intent与intent过滤器匹配

    • 系统通过调用其方法并将其传递给匹配活动Activity B。

    注意:如果多个intent过滤器兼容,系统将显示一个对话框,以便用户可以选择要使用的应用程序

    注意:启动时Service,请 指定组件名称。否则,您无法确定哪些服务将响应意图,并且用户无法查看哪个服务启动。

    Intent intent = new Intent();  
    intent.setAction("abcdefg");  
    startActivity(intent);  
    

    二、Intent组成部分

    • componentName:目的组件
    • action(动作):用来表现意图的行动
    • category(类别):用来表现动作的类别
    • data(数据):表示与动作要操纵的数据
    • type(数据类型):对于data范例的描写
    • extras(扩展信息):扩展信息
    • Flags(标志位):期望这个意图的运行模式

    显式Intent用component,隐式Intent用其余部分

    1、componentName :明确指定Intent的目标组件的类名称

    可以通过setComponent、setClass、setClassName、Intent构造

    //Intent构造
    Intent intent = new Intent(this, SecondActivity.class);  
    startActivity(intent); 
    
    //setComponent方法
    ComponentName componentName = new ComponentName(this, SecondActivity.class);  
    // 或者ComponentName componentName = new ComponentName(this, "com.example.app016.SecondActivity");  
    // 或者ComponentName componentName = new ComponentName(this.getPackageName(), "com.example.app016.SecondActivity");  
      
    Intent intent = new Intent();  
    intent.setComponent(componentName);  
    startActivity(intent); 
    
    //setClass/setClassName方法
    Intent intent = new Intent();  
      
    intent.setClass(this, SecondActivity.class);  
    // 或者intent.setClassName(this, "com.example.app016.SecondActivity");  
    // 或者intent.setClassName(this.getPackageName(), "com.example.app016.SecondActivity");  
              
    startActivity(intent);  
    

    Action :用来表现意图的行动

    只能指定一个Intent

    Intent类中,定义了批量的Action,比如ACTION_VIEW,ACTION_PICK

    2、category(类别):用来表现动作的类别

    可以指定多个category,类别越多,动作越具体,意图越明确

    注意

    • 清单文件中:一定要指定action和category,如要使用默认值,则设为android.intent.category.DEFAULT

    • 自己定义的某个Activity要通过隐式启动,在AndroidManifast.xm那么必须加上android.intent.category.DEFAULT,否则不起作用

    • 代码中:如果没有指定category,就默认为android.intent.category.DEFAULT

    • 只有action和所有category同时匹配,才算匹配成功。

    • 如果有多个组件被匹配成功,就会以对话框列表的方式让用户进行选择。

    举个例子

    清单文件声明:

        <activity android:name=".intent.TestActivity">
            <intent-filter>
                <action android:name="com.example.lenovo.mpplication001.actiontest"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.example.lenovo.mpplication001.categorytest"/>
            </intent-filter>
        </activity>
    

    代码隐式启动:

        Intent intent = new Intent();
        intent.setAction(com.example.lenovo.mpplication001.actiontest);
        intent.addCategory(com.example.lenovo.mpplication001.categorytest);
        startActivity(intent);
    

    3、Data & Type:Url和数据类型

    解释:

    • 清单文件只有data标签。
    • 代码中分为data 和 type。(和清单文件的data相关属性进行匹配)

    A、data标签

    属性 解释
    scheme 协议
    host 主机
    port 端口
    path 用来匹配完整的路径
    pathPrefix 用来匹配路径的开头部分
    pathPattern 用表达式来匹配整个路径
    mimeType 用来匹配数据类型或MIME类型

    mimeType 用于type,其他属性用于Url的指定(也就是代码中的data),规则:scheme://host:port/path or pathPrefix or pathPattern`

    属性还有android:ssp , android:sspPrefix 以及 android:sspPattern用于特殊处理
    推荐阅读:通过 android:ssp 高效过滤 Android Intents

    B、代码中的data 和 type

    方法有(这里的data指的是Url对象,uri代表数据的地址,属于一种标识符):

    • setType 调用后设置 mimeType,然后将 data 置为 null;
    • setData 调用后设置 data,然后将 mimeType 置为 null;
    • setDataAndType 调用后才会同时设置 data 与 mimeType。

    举个例子

    例子1,设置data:

    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="http"  android:host="www.baidu.com"/>
    </intent-filter>
    
    intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    Uri data=Uri.parse("http://www.baidu.com");
    intent.setData(data);
    startActivity(intent);
    
    image.png

    例子2,设置type:

    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    
    intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setType("text/plain");
    startActivity(intent);
    
    image.png

    推荐阅读:
    Android 常用 mimeType 表
    intent-filter 之 data 「scheme, host, port, mimeType, path, pathPrefix, pathPattern」

    extras和Flags

    Intent的常见应用

    推荐阅读:官方文档之Intent的常见应用

    相关文章

      网友评论

          本文标题:Intent

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