1、隐式Intent并不明确指出想要启动哪一个Activity,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析Intent,并帮我们找到合适的Activity去启动。
2、通过在AndroidManifest.xml的<activity>标签下添加<intent-filter>的内容,可以指定当前Activity能够响应的action和category

3、在<action>标签中指明了当前Activity可以响应的com.example.activitytest.ACTION_ START这个action,而<category>标签则包含了一些附加信息,更精确的指明了当前Activity能够响应的Intent中还可能带有的category。
4、只有<action>和<category>中的内容同时匹配Intent中指定的action和category时,这个Activity才能响应应该的Intent。
5、FirstActivity中按钮的点击事件:
button1.setOnClickListener{
val intent = Intent("com.example.activitytest.ACTION_START")//使用了Intent的另一个构造函数,直接将action的字符串传入,表明要启动能够响应com.example.activitytest.ACTION_START这个action的Activity。
//android.intent.category.DEFAULT是一种默认的category,在调用 startActivity()方法的时候会自动将这个category添加到intent中。
startActivity(intent)
}
6、每个Intent中只能指定一个action,但是能指定多个category,可以调用Intent中的addCategory()方法来添加一个category
button1.setOnClickListener{
val intent = Intent("com.example.activitytest.ACTION_START")
startActivity(intent)
intent.addCategory("com.example.activitytest.MY_CATEGORY")//自定义category,值为com.example.activitytest.MY_CATEGORY
}
7、需要在<intent-filter>标签中添加一个category声明,才可以响应Activity,否则程序将因为找不到Activity而崩溃。

8、使用隐式Intent不仅可以启动自己程序内的Activity,还可以启动其他程序的Activity,这就使多个应用程序之间的功能共享成为了可能。
8.1、程序中需要展示一个网页:
button1.setOnClickListener{
val intent = Intent(Intent.ACTION_VIEW)//首先指定了intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,常量值为android.intent.action.VIEW
intent.data = Uri.parse("https://www.baidu.com")//然后通过Uri.parse()方法将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将Uri对象传递进去。
startActivity(intent)
}
8.2、与此对应,我们还可以在<intent-filter>标签中在配置一个<data>标签,用于更精确的指定当前的Activity能够响应的数据,<data>标签中主要可以配置的内容:
8.2.1、android:scheme:用于指定数据的协议部分,如https部分。
8.2.2、android:host:用于指定数据的主机部分,如www.baidu.com部分。
8.2.3、android:port:用于指定数据的端口部分,一般紧随在主机名之后。
8.2.4、android:path:用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
8.2.5、android:mimeType:用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
8.2.6、只有当<data>标签中指定的内容和Intent中携带的Data完全一致时,当前的Activity才能够响应Intent。
8.2.7、由于Android Studio认为所有能够个响应ACTION_VIEW的Activity都应该加上BROWSABLE的category,否则就会给出警告提醒。加上BROWSABLE的category是为了实现deep link功能,所以目前直接在<intent-filter>标签上使用tools:ignore属性将警告忽略即可。(PS:在添加data标签之后intent-filter中的代码就报红出错了,加上了tools-filter之后还是红,按了option+enter之后突然就好了,大概是导入了使用tools的包)

8.3、除了https协议之外,还可以指定很多其他协议,比如geo表示显示地理位置,tel表示拨打电话。
button1.setOnClickListener{
val intent = Intent(Intent.ACTION_DIAL)//调用系统拨号界面
intent.data = Uri.parse("tel:10086")
startActivity(intent)
}
网友评论