人生苦短,kotlin未嘗不可~
實現目標
點擊FirstActivity
(主Activity)的一個Button
跳轉到SecondActivity
實現效果
方法1:使用顯式Intent
首先,我們要爲FirstActivity
創建一個按鈕。
編輯其佈局文件activity_main.xml
<?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">
<!--在中間添加一個按鈕(ID:myButton)-->
<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
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//爲myButton按鈕創建監聽
myButton.setOnClickListener{
//從當前Activity跳轉到SecondActivity
val intent = Intent(this,SecondActivity::class.java)
//startActivity()方法專門用於啓動Activity
//他接受一個Intent參數
startActivity(intent)
}
}
}
上述SecondActivity與FirstActivity處於同一個包下
代碼說明
Intent
- 是Android程序中各組件之間進行交互的一種重要方式。
可用於啓動Activity、啓動Service以及發送廣播等場景 - 上述所用的一個構造函數:
Intent(Context packageContext, Class<?> cls)
- 第一個參數
Context
要求提供一個Activity的上下文 - 第二個參數
Class
用於指定想要啓動的目標Activity
- 第一個參數
- 是Android程序中各組件之間進行交互的一種重要方式。
startActivity()
方法 : 接收一個Intent
參數,從而啓動目標Activity
方法2:使用隱式Intent
- 使用
Intent
的另一個構造函數:直接將Activity
的action
傳入
在AndroidMainifest.xml
中修改SecondActivity
的標籤屬性
<activity android:name=".SecondActivity" android:label="Second_Activity">
<intent-filter>
<!--指定當前Activity可以響應的action和category-->
<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
中按鈕的點擊事件
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//添加點擊監聽
myButton.setOnClickListener{
//將action的內容傳入Intent
val intent = Intent("com.example.myapplication.ACTION_START")
//指定category(也可指定多個)
intent.addCategory("android.intent.category.MYCAT")
//啓動能同時匹配上述action和category的Activity
startActivity(intent)
}
}
}
每個
Intent
中只能有一個action
,但能指定多個category
。
如果不指定category
,則startActivity()方法
會自動將android.intent.category.DEFAULT
添加到Intent中
跳轉到其他程序的Activity
以跳轉到瀏覽器爲例
只需要修改FirstActivity
中按鈕點擊事件的代碼:
button.setOnClickListener{
//首先指定intent的action是Intent.ACTION_VIEW
val intent = Intent(Intent.ACTION_VIEW)
//然後通過Uri.parse方法將字符串解析爲Uri對象,並傳遞到Intent的data中
intent.data = Uri.parse("https://www.baidu.com")//實際上調用了Intent的setData()方法
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
<activity
android:name=".SecondActivity"
android:label="Second_Activity">
<intent-filter tools:ignore="AppLinkUrlError">
<!-- 指定所要響應的action內容 -->
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" />
<!-- 使Activity精準響應https的內容 -->
<data android:scheme="https"/>
</intent-filter>
</activity>
只有
action
和data
內容都匹配才能實現跳轉。
這裏如果將android:scheme="https"
改爲android:scheme="http"
,那麼將無法響應。
除了https
協議外,我們還可以指定其他的協議,比如geo
表示顯示地理位置、tel
表示撥打電話。
下面的代碼展示瞭如何在程序中調用系統撥號界面:
button.setOnClickListener{
val intent = Intent(Intent.ACTION_DIAL)
intent.data = Uri.parse("tel:10086")
startActivity(intent)
}