1、Intent的分类
> 显式意图
> 隐式意图
》显示意图的使用
Intent intent = new Intent(MaintActivity.this,SecondActivity.class)
》隐式意图的使用
隐式Intent相比于显式Intent来说,没有指明要跳转的界面,而是采用一些抽象的action和catagory信息去进行匹配
相应的activity
其使用形式如下:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="https"/>
</intent-filter>
</activity>
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
/**
使用隐式意图的时候,注意action和catagory完全一样的时候才会进行跳转,但是在上面使用的时候好像没有看到
指定的action和catagory啊?这是怎么回事呢?其实在我们Intent的源码的时候可以看到它有多个重载的构造方法
其中常用的有如下两种:
》Intent(Context packageContext, Class<?> cls)
》Intent(String action)
所以得到其实上面已经指定了action了!就是“Intent.ACTION_VIEW”,但是和“android.intent.action.VIEW”
好像并不一样,这是怎么回事呢?我们在后面的时候会说到。那么现在还有一个问题就是我们并没有指定catagory,
其实"android.intent.category.DEFAULT"是一中默认的catagory,当使用startActivity()的时候会自动将这
个catagory添加到intent中
*/
》intent-filter内容介绍
》action: 其实就相当于一个标识,每一个intent中只能指定一个action,指定的方式有两种,如下:
♥ Intent intent = new Intent("action")
♥ intent.setAction("action");
注意: action可以是自定义的一些字符串,只要两者一致就行,但是有一些是系统中自带的一些action,比如说
拨打电话、使用相机等,其值也是一样的,但是用了一些常量替换的,比如我们上面使用的“Intent.ACTION_VIEW”
就是用来打开浏览器程序并显示指定的URL,“Intent.ACTION_VIEW”的值就是"android.intent.action.VIEW"
》category: 也是匹配的一个标识,它是有一个默认的值,所以我们基本上是不用显示的指定的,catagory不同action,
它是可以有多个值得,即在<intent-filter>中可以配置多个,只要有一条匹配上即可,其指定的方法如下
intent.addCategory("catagory");
》data: 用于精确的指定当前活动能够响应什么类型的数据,其中可以配置一下内容:
♥ android:scheme。 用于指定数据的写一部分,如上例中的https部分
♥ android:host。 用于指定数据的主机名部分,如上例中www.baidu.com
♥ android:port。 用于指定数据的端口部分,一般紧随在主机名之后
♥ android:path。 用于指定主机名和端口号之后的部分,如一段网址中跟在域名之后的部分
♥ android:mimeType。 用于指定可以处理的数据类型,允许以通配符的方式进行指定
不过一般不会再data中指定很多的内容,一般如上来说,只需指定android:scheme = “https”,就可以响应所有的https协议了
》隐式Intent使用的场景
♥ 调用系统的功能,比如调用打电话
Intent intent = new Intent(Intent.ACTION_DIAL)
Uri data = Uri.parse("tel:" + phoneNumber)
intent.setData(data)
startActivity(intent)
♥ 项目(module app)依赖第三方的模块(module B),当(module app)调用(module B)中的相关活动时,只要依赖
(module B)就可以了,但是若是第三方模块(module B)想要调用项目(module app)中的活动,同样依赖(module app),
但是这种双向依赖的方式,显然是不可能的,所以就可以采用隐式Intent去调用
》使用Intent启动Activity的最佳写法
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("param1",param1);
intent.putExtra("param2",param2);
startActivity(intent);
/**
虽然这种写法虽然是正确的,但是在一定程度上会造成一些问题,假如SecondActivity不是我们自己写的,那么在进行传参
的时候,我们必须去阅读SecondActivity的源码来确定需要传的参数,但是任何时候读别人的代码都不是一件容易的事,特别
是当项目比较大的时候,或者去问写这个代码的同事,但是这无疑也增加了沟通的成本,所以可采用如下方式:
*/
public static void actionStart(Context context,String param1,String param2) {
Intent intent = new Intent(context,SecondActivity.class);
intent.putExtra("param1",param1);
intent.putExtra("param2",param2);
context.startActivity(intent);
}
SecondActivity.actionStart(MainActivity.this,"param1","param2");