人生苦短,kotlin未尝不可~
实现目标
点击FirstActivity
(主Activity)的一个Button
跳转到SecondActivity
实现效果

方法1:使用显式Intent
首先,我们要为FirstActivity
创建一个按钮。
编辑其布局文件activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".FirstActivity">
<Button android:id="@+id/myButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button" tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteY="341dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
|
然后为刚创建的按钮添加监听。
编辑FirstActivity.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)
myButton.setOnClickListener{ val intent = Intent(this,SecondActivity::class.java) startActivity(intent) }
} }
|
上述SecondActivity与FirstActivity处于同一个包下
代码说明
Intent
- 是Android程序中各组件之间进行交互的一种重要方式。
可用于启动Activity、启动Service以及发送广播等场景
- 上述所用的一个构造函数:
Intent(Context packageContext, Class<?> cls)
- 第一个参数
Context
要求提供一个Activity的上下文
- 第二个参数
Class
用于指定想要启动的目标Activity
startActivity()
方法 : 接收一个Intent
参数,从而启动目标Activity
方法2:使用隐式Intent
- 使用
Intent
的另一个构造函数:直接将Activity
的action
传入
在AndroidMainifest.xml
中修改SecondActivity
的标签属性
1 2 3 4 5 6 7 8
| <activity android:name=".SecondActivity" android:label="Second_Activity"> <intent-filter> <action android:name="com.example.myapplication.ACTION_START"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.MYCAT"/> </intent-filter> </activity>
|
只有action
和category
标签中的内容同时匹配Intent
中的指定action
和category
时,这个Activity
才能响应该Intent
再修改FirstActivity
中按钮的点击事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class FirstActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) myButton.setOnClickListener{ val intent = Intent("com.example.myapplication.ACTION_START") intent.addCategory("android.intent.category.MYCAT") startActivity(intent) } } }
|
每个Intent
中只能有一个action
,但能指定多个category
。
如果不指定category
,则startActivity()方法
会自动将android.intent.category.DEFAULT
添加到Intent中
跳转到其他程序的Activity
以跳转到浏览器为例
只需要修改FirstActivity
中按钮点击事件的代码:
1 2 3 4 5 6 7
| button.setOnClickListener{ val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("https://www.baidu.com") startActivity(intent) }
|
这样的话就可以实现点击按钮后自动跳转到浏览器并显示百度官网了。
Intent.ACTION_VIEW
的常量值为android.intent.action.VIEW
同时,我们还可以在<intent-filter>
标签中再配置一个<data>
标签,用于更精确的指定当前Activity能够响应的数据。<data>
标签中主要可以配置以下内容:
内容 |
作用 |
android:scheme |
用于指定数据的协议部分,如上述https |
android:host |
指定数据的主机名部分,如www.baidu.com |
android:port |
用于指定端口部分 |
android:path |
用于指定端口后面的部分 |
android:mimeType |
指定可以处理的数据类型 |
比如让SecondActivity
能够精准响应https
的数据
只需要修改其布局文件second_layout.xml
1 2 3 4 5 6 7 8 9 10 11
| <activity android:name=".SecondActivity" android:label="Second_Activity"> <intent-filter tools:ignore="AppLinkUrlError"> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https"/> </intent-filter> </activity>
|
只有action
和data
内容都匹配才能实现跳转。
这里如果将android:scheme="https"
改为android:scheme="http"
,那么将无法响应。
除了https
协议外,我们还可以指定其他的协议,比如geo
表示显示地理位置、tel
表示拨打电话。
下面的代码展示了如何在程序中调用系统拨号界面:
1 2 3 4 5
| button.setOnClickListener{ val intent = Intent(Intent.ACTION_DIAL) intent.data = Uri.parse("tel:10086") startActivity(intent) }
|