使用Intent進行Activity的跳轉-Android-kotlin

人生苦短,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
  • startActivity()方法 : 接收一個Intent參數,從而啓動目標Activity

方法2:使用隱式Intent

  • 使用Intent的另一個構造函數:直接將Activityaction傳入

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>

只有actioncategory標籤中的內容同時匹配Intent中的指定actioncategory時,這個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>

只有actiondata內容都匹配才能實現跳轉。
這裏如果將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)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章