美文网首页
Activity-隐式Intent

Activity-隐式Intent

作者: cjjjjjj | 来源:发表于2022-04-07 09:05 被阅读0次

1、隐式Intent并不明确指出想要启动哪一个Activity,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析Intent,并帮我们找到合适的Activity去启动。

2、通过在AndroidManifest.xml的<activity>标签下添加<intent-filter>的内容,可以指定当前Activity能够响应的action和category

AndroidManifest.xml添加代码

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而崩溃。

添加一个category声明

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的包)

AndroidManifest.xml

8.3、除了https协议之外,还可以指定很多其他协议,比如geo表示显示地理位置,tel表示拨打电话。

button1.setOnClickListener{

    val intent = Intent(Intent.ACTION_DIAL)//调用系统拨号界面

    intent.data = Uri.parse("tel:10086")

    startActivity(intent)

}

相关文章

网友评论

      本文标题:Activity-隐式Intent

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