Kotlin安卓开发学习–Intent的使用

Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。

Intent大致可以分为两种:显式Intent和隐式Intent。

Intent存在多个构造函数的重载,其中最基本的一个Intent(Context packageContext, Class<?> cls)前一个参数接受一个启动activity的上下文,后一个参数提供需要启动的Activity。之后我们就能使用startActivity方法来启动Activity,而这个方法正是接受一个Intent对象:

val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)

以上是显式Intent的用法,它通过指定一个明确的Activity来实现”意图”指定。

而隐式Intent则不同,它通过指定更为抽象的action和category等信息,然后交由系统去分析这个Intent,并寻找合适的Activity来启动。

那么如何去设定一个Activity的action和category等信息?当我们创建一个新的Activity时,Android Studio会自动在Mainifest内注册该Activity信息。而我们则可以在其中配置信息内容:

<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,因为这已经是默认了。

之后我们需要启动则可以:

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能够响应的数据。标签中主要可以配置以下内容。

  1. android:scheme。用于指定数据的协议部分,如上例中的https部分。
  2. android:host。用于指定数据的主机名部分,如上例中的www.baidu.com部分。
  3. android:port。用于指定数据的端口部分,一般紧随在主机名之后。
  4. android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
  5. android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

只有当标签中指定的内容和Intent中携带的Data完全一致时,当前Activity才能够响应该Intent。不过,在标签中一般不会指定过多的内容。

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

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