- , 10 10月 2022
- 作者 847954981@qq.com
- 后端学习
Kotlin安卓开发学习–Intent的使用
Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。
Intent大致可以分为两种:显式Intent和隐式Intent。
Intent存在多个构造函数的重载,其中最基本的一个Intent(Context packageContext, Class<?> cls)前一个参数接受一个启动activity的上下文,后一个参数提供需要启动的Activity。之后我们就能使用startActivity方法来启动Activity,而这个方法正是接受一个Intent对象:
代码语言:javascript复制val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
以上是显式Intent的用法,它通过指定一个明确的Activity来实现”意图”指定。
而隐式Intent则不同,它通过指定更为抽象的action和category等信息,然后交由系统去分析这个Intent,并寻找合适的Activity来启动。
那么如何去设定一个Activity的action和category等信息?当我们创建一个新的Activity时,Android Studio会自动在Mainifest内注册该Activity信息。而我们则可以在其中配置信息内容:
代码语言:javascript复制<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
我们可以看出,可以在<activity>标签内使用<intent-filter>来配置意图过滤器,在其中则可以配置action和category等信息。
注意的是,只有当action和category内所有内容与intent匹配时这个Intent才能响应此Activity
每个Intent中只能指定一个action,但能指定多个category
但如果category只配置了DEFAULT属性则不需要再在intent中配置category,因为这已经是默认了。
之后我们需要启动则可以:
代码语言:javascript复制button1.setOnClickListener {
val intent = Intent("com.example.activitytest.ACTION_START")
startActivity(intent)
}
隐式Intent存在别的用法。我们可以使用intent.data来传入值。比如使用intent.data = Uri.parse("https://www.baidu.com")
来传入将字符串转化为URI对象,并传入intent内。但这有什么用呢?
比如前面我们传入的URI,如果intent的action是打开网页,则通过传值,可以实现打开固定网页的效果。
与此对应,我们还可以在标签中再配置一个标签,用于更精确地指定当前Activity能够响应的数据。标签中主要可以配置以下内容。
- android:scheme。用于指定数据的协议部分,如上例中的https部分。
- android:host。用于指定数据的主机名部分,如上例中的www.baidu.com部分。
- android:port。用于指定数据的端口部分,一般紧随在主机名之后。
- android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
- android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只有当标签中指定的内容和Intent中携带的Data完全一致时,当前Activity才能够响应该Intent。不过,在标签中一般不会指定过多的内容。
除了https协议外,我们还可以指定很多其他协议,比如geo表示显示地理位置、tel表示拨打电话。
代码语言:javascript复制val intent = Intent(Intent.ACTION_DIAL)
intent.data = Uri.parse("tel:10086")