Intent

2018-10-16  本文已影响0人  _Rice_

推荐阅读: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

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

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

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

二、Intent组成部分

显式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,类别越多,动作越具体,意图越明确

注意

举个例子

清单文件声明:

    <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和数据类型

解释:

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代表数据的地址,属于一种标识符):

举个例子

例子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的常见应用

上一篇下一篇

猜你喜欢

热点阅读