1、Intent
Intent是各个组件之间交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,而且还能在各组件之间传递数据。Intent一般可用于启动Activity、启动Service、发送广播等场景。
Intent大致可分为2中:
1、显示Intent
2、隐式Intent
1.1、显示Intent打开Activity
fun openActivity(){
val intent = Intent(this, KotlinFirstActivity::class.java)
intent.putExtra("param", "testParams")
startActivity(intent)
}
注意:KotlinFirstActivity::class.java就相当于Java中的KotlinFirstActivity.class。
1.2、隐式Intent打开程序内的Activity
相比于显示Intent,隐式Intent并不指明启动那个Activity而是指定了一系列的action和category,然后交由系统去分析找到合适的Activity并打开。
什么是合适的Activity,其实就是和隐式Intent中指定的action和category完全匹配的Activity,而action和category我们可以在AdnroidManifest中指定。
在标签中配置了action和category,只有和隐式Intent中的action和category完全匹配才能正常的打开该页面。
val intent = Intent("com.example.abu.alertdialogdemo.ACTION_START")
startActivity(intent)
不是说action和category要完全匹配才能打开页面吗?这是因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()时会自动将这个category添加到Intent中。所以在Manifest中一定不要忘记配置这个默认的category:android.intent.category.DEFAULT,否则会报错。
还有一点需要注意:Intent中只能添加一个action,但是可以添加多个category。
1.3、隐式Intent打开程序外的Activity
比如我们要打开系统的浏览器
fun openWeb(view: View) {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.baidu.com")
startActivity(intent)
}
Intent.ACTION_VIEW是系统内置的动作,然后将https://www.baidu.com通过Uri.parse()转换成Uri对象,传递给intent.setData(Uri uri)函数。Kotlin中intent.data=Uri.parse("https://www.baidu.com")就相当于Java中的intent.setData(Uri.parse("https://www.baidu.com")),这是Kotlin中的语法糖。
与此对应在标签中配置一个标签,用于更精确的指定当前Activity能够相应的数据。标签中主要可以配置一下内容:
1、android:scheme:用于指定数据的协议部分,如https
2、android:host:用于指定数据的主机名部分,如www.baidu.com
3、android:port:用于指定数据的端口,一般紧随主机名后
4、android:path:用于指定数据的路径
5、android:mimeType:用于指定支持的数据类型
只有当标签中指定的内容和Intent中携带的data完全一致时,当前Activity才能响应该Intent。下面我们通过设置data,让它也能响应打开网页的Intent。
我们在ThirdActivity的中配置当前Activity能够响应的action是Intent.ACTION_VIEW的常量值,而category指定了默认的category