Android學習筆記之——通過Intent來啓動不同的Activity

之前博文《Android學習筆記之——activity》已經對Android開發的activity做了基本的介紹了。但是,在啓動器中點擊應用的圖標只會進入到該應用的主活動,本博文學習一下由主活動跳轉到其他活動。

 

目錄

創建second activity

啓動第二個活動——Intent

顯式Intent

隱式Intent

更多隱式Intent的用法(啓動其他activity)

構建一個活動能響應Intent


 

創建second activity

仍然還是右擊com.example.activitytest包→New→Activity→Empty Activity,會彈出一個創建活動的對話框

Android Studio會爲我們自動生成SecondActivity.java和second_layout.xml這兩個文件。

打開Layout,編輯second_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 2"
        />

</LinearLayout>

對於SecondActivity

package com.example.activitytest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
    }
}

任何一個活動都是需要在AndroidManifest.xml中註冊的,不過幸運的是,Android Studio已經自動完成了,可以打開AndroidManifest.xml瞧一瞧:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity"></activity>
        <activity android:name=".FirstActivity">
            android:label="This is FirstActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

由於SecondActivity不是主活動,因此不需要配置<intent-filter> 標籤裏的內容,註冊活動的代碼也簡單了許多。現在第二個活動已經創建完成。

 

啓動第二個活動——Intent

Intent是Android程序中各組件之間進行交互的一種重要方式,它不僅可以指明當前組件想要執行的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啓動活動、啓動服務以及發送廣播等場景。本博文先介紹一下Intent啓動活動

顯式Intent

Intent有多個構造函數的重載,其中一個是

Intent(Context packageContext, Class<?>cls) 

這個構造函數接收兩個參數,

  • 第一個參數Context 要求提供一個啓動活動的上下文
  • 第二個參數Class 則是指定想要啓動的目標活動

通過這個構造函數就可以構建出Intent的“意圖”。Activity類中提供了一個startActivity() 方
法,這個方法是專門用於啓動活動的,它接收一個Intent 參數,所以只需要將構建好的Intent傳入startActivity() 方法就可以啓動目標活動了。

將博文文Android學習筆記之——activity》中的按鈕點擊代碼改爲:

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends AppCompatActivity {

    //重寫onCreateOptionsMenu方法,將菜單顯示出來
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通過getMenuInflater() 方法能夠得到MenuInflater 對象
        //再調用它的inflate() 方法就可以給當前活動創建菜單了
        //inflate() 方法接收兩個參數,
        //第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
        //第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。

        return true;
        //返回true ,表示允許創建的菜單顯示出來
        //若返回了false ,創建的菜單將無法顯示。
    }

    //重寫onOptionsItemSelected方法,定義菜單的相應事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定義佈局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
        //setContentView方法用於加載佈局
        //項目中添加的任何資源都會在R文件中生成一個相應的資源id
        // 因此,所創建的layout文件會自動將id添加到R文件中
        // 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通過findViewById() 方法獲取到在佈局文件中定義的元素
        //在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
        //findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重寫
            public void onClick(View v) {
                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
                //構建出intent的“意圖”
                startActivity(intent);//啓動活動
            }
        });

//        button1.setOnClickListener(new View.OnClickListener() {
//            //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
//            //點擊按鈕時就會執行監聽器中的onClick() 方法。
//            @Override //表示重寫
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
//                //通過靜態方法makeText() 創建出一個Toast對象
//                //並通過show()將Toast顯示出來
//
//                // makeText() 方法需要傳入3個參數。
//                // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
//                // 第二個參數是Toast顯示的文本內容,
//                // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

 

隱式Intent

對於隱式Intent並不明確指出我們想要啓動哪一個活動,而是指定了一系列更爲抽象的action 和category 等信息,然後交由系統去分析這個Intent,並幫我們找出合適的活動去啓動。

在AndroidManifest.xml中。SecondActivity配置<intent-filter> 標籤裏的內容,可以指定當前活動能夠響應的action 和category(類別)

只有<action> 和<category> 中的內容同時能夠匹配上Intent中指定的action 和category時,這個活動才能響應該Intent。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SecondActivity"></activity>
            <intent-filter>
                <action android:name="com.example.ActivityTest.ACTION_START" />
                //在<action> 標籤中我們指明瞭當前活動可以響應
com.example.activitytest.ACTION_START 這個action
                <category android:name="android.intent.category.DEFAULT" />
                //更精確地指明瞭當前的活動能夠響應的Intent中還可能帶有的category
            </intent-filter>>   
        
        
        <activity android:name=".FirstActivity">
            android:label="This is FirstActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

然後修改FirstActivity中按鈕的點擊事件:

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends AppCompatActivity {

    //重寫onCreateOptionsMenu方法,將菜單顯示出來
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通過getMenuInflater() 方法能夠得到MenuInflater 對象
        //再調用它的inflate() 方法就可以給當前活動創建菜單了
        //inflate() 方法接收兩個參數,
        //第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
        //第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。

        return true;
        //返回true ,表示允許創建的菜單顯示出來
        //若返回了false ,創建的菜單將無法顯示。
    }

    //重寫onOptionsItemSelected方法,定義菜單的相應事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定義佈局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
        //setContentView方法用於加載佈局
        //項目中添加的任何資源都會在R文件中生成一個相應的資源id
        // 因此,所創建的layout文件會自動將id添加到R文件中
        // 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通過findViewById() 方法獲取到在佈局文件中定義的元素
        //在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
        //findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重寫
            public void onClick(View v) {
                Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
                //構建出intent的“意圖”
                startActivity(intent);//啓動活動
            }
        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重寫
//            public void onClick(View v) {
//                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//                //構建出intent的“意圖”
//                startActivity(intent);//啓動活動
//            }
//        });



//        button1.setOnClickListener(new View.OnClickListener() {
//            //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
//            //點擊按鈕時就會執行監聽器中的onClick() 方法。
//            @Override //表示重寫
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
//                //通過靜態方法makeText() 創建出一個Toast對象
//                //並通過show()將Toast顯示出來
//
//                // makeText() 方法需要傳入3個參數。
//                // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
//                // 第二個參數是Toast顯示的文本內容,
//                // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

得到的效果與顯示intent一樣的

每個Intent中只能指定一個action ,但卻能指定多個category 。

目前我們的Intent中只有一個默認的category ,那麼現在再來增加一個吧。

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends AppCompatActivity {

    //重寫onCreateOptionsMenu方法,將菜單顯示出來
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通過getMenuInflater() 方法能夠得到MenuInflater 對象
        //再調用它的inflate() 方法就可以給當前活動創建菜單了
        //inflate() 方法接收兩個參數,
        //第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
        //第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。

        return true;
        //返回true ,表示允許創建的菜單顯示出來
        //若返回了false ,創建的菜單將無法顯示。
    }

    //重寫onOptionsItemSelected方法,定義菜單的相應事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定義佈局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
        //setContentView方法用於加載佈局
        //項目中添加的任何資源都會在R文件中生成一個相應的資源id
        // 因此,所創建的layout文件會自動將id添加到R文件中
        // 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通過findViewById() 方法獲取到在佈局文件中定義的元素
        //在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
        //findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重寫
            public void onClick(View v) {
                Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
                //構建出intent的“意圖”
                intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
                //調用Intent中的addCategory() 方法來添加一個category

                startActivity(intent);//啓動活動
            }
        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重寫
//            public void onClick(View v) {
//                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//                //構建出intent的“意圖”
//                startActivity(intent);//啓動活動
//            }
//        });



//        button1.setOnClickListener(new View.OnClickListener() {
//            //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
//            //點擊按鈕時就會執行監聽器中的onClick() 方法。
//            @Override //表示重寫
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
//                //通過靜態方法makeText() 創建出一個Toast對象
//                //並通過show()將Toast顯示出來
//
//                // makeText() 方法需要傳入3個參數。
//                // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
//                // 第二個參數是Toast顯示的文本內容,
//                // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

對於新增的category,到AndroidManifest.xml中。SecondActivity配置<intent-filter>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <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 android:name=".FirstActivity">
            android:label="This is FirstActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

更多隱式Intent的用法(啓動其他activity)

使用隱式Intent,我們不僅可以啓動自己程序內的活動,還可以啓動其他程序的活動,這使得Android多個應用程序之間的功能共享成爲了可能。比如說應用程序中需要展示一個網頁,這時沒有必要自己去實現一個瀏覽器(事實上也不太可能),而是隻需要調用系統的瀏覽器來打開這個網頁就行了。

修改FirstActivity中按鈕點擊事件的代碼,如下所示:

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends AppCompatActivity {

    //重寫onCreateOptionsMenu方法,將菜單顯示出來
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通過getMenuInflater() 方法能夠得到MenuInflater 對象
        //再調用它的inflate() 方法就可以給當前活動創建菜單了
        //inflate() 方法接收兩個參數,
        //第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
        //第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。

        return true;
        //返回true ,表示允許創建的菜單顯示出來
        //若返回了false ,創建的菜單將無法顯示。
    }

    //重寫onOptionsItemSelected方法,定義菜單的相應事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定義佈局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
        //setContentView方法用於加載佈局
        //項目中添加的任何資源都會在R文件中生成一個相應的資源id
        // 因此,所創建的layout文件會自動將id添加到R文件中
        // 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通過findViewById() 方法獲取到在佈局文件中定義的元素
        //在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
        //findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重寫
            public void onClick(View v) {
                Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android內部動作)
                //構建出intent的“意圖”
                intent.setData(Uri.parse("http://www.baidu.com"));
               //通過Uri.parse() 方法,將一個網址字符串解析成一個Uri對象,
                //再調用Intent的setData() 方法將這個Uri 對象傳遞進去
                //setData()接收一個Uri 對象,主要用於指定當前Intent正在操作的數據,
                // 而這些數據通常都是以字符串的形式傳入到Uri.parse() 方法中解析產生的

                startActivity(intent);//啓動活動
            }
        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重寫
//            public void onClick(View v) {
//                Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
//                //構建出intent的“意圖”
//                intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
//                //調用Intent中的addCategory() 方法來添加一個category
//
//                startActivity(intent);//啓動活動
//            }
//        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重寫
//            public void onClick(View v) {
//                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//                //構建出intent的“意圖”
//                startActivity(intent);//啓動活動
//            }
//        });



//        button1.setOnClickListener(new View.OnClickListener() {
//            //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
//            //點擊按鈕時就會執行監聽器中的onClick() 方法。
//            @Override //表示重寫
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
//                //通過靜態方法makeText() 創建出一個Toast對象
//                //並通過show()將Toast顯示出來
//
//                // makeText() 方法需要傳入3個參數。
//                // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
//                // 第二個參數是Toast顯示的文本內容,
//                // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

一開始會提醒缺少Uri這個量,通過“alt+shift+enter”就可以自動增加import了(不得不感嘆一下,真方便hhh)

運行結果如下圖所示

除此之外,還可以在<intent-filter> 標籤中再配置一個<data> 標籤,用於更精確地指定當前活動能夠響應什麼類型的數據。<data> 標籤中主要可以配置以下內容。

  • android:scheme 。用於指定數據的協議部分,如上例中的http部分。
  • android:host 。用於指定數據的主機名部分,如上例中的www.baidu.com部分。
  • android:port 。用於指定數據的端口部分,一般緊隨在主機名之後。
  • android:path 。用於指定主機名和端口之後的部分,如一段網址中跟在域名之後的內容。
  • android:mimeType 。用於指定可以處理的數據類型,允許使用通配符的方式進行指定。

只有<data> 標籤中指定的內容和Intent中攜帶的Data完全一致時,當前活動才能夠響應該Intent。不過一般在<data> 標籤中都不會指定過多的內容,如上面瀏覽器示例中,其實只需要指定android:scheme 爲http,就可以響應所有的http協議的Intent了。(甚至不指定也可以正常運行)

 

構建一個活動能響應Intent

構建一個新的activity,然後編輯third_layout.xml,將裏面的代碼替換成如下內容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 3"
        />

</LinearLayout>

ThirdActivity中的代碼保持不變。在AndroidManifest.xml中修改ThirdActivity的註冊信息:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http" />
            </intent-filter>
        </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 android:name=".FirstActivity">
            android:label="This is FirstActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

可以看到,系統自動彈出了一個列表,顯示了目前能夠響應這個Intent的所有程序

選擇瀏覽器會出現之前的百度主頁;選擇ActivityTest,則會啓動ThirdActivity

除了http協議外,我們還可以指定很多其他協議,比如geo表示顯示地理位置、tel表示撥打電話。

修改FirstActivity代碼如下:

package com.example.activitytest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends AppCompatActivity {

    //重寫onCreateOptionsMenu方法,將菜單顯示出來
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //通過getMenuInflater() 方法能夠得到MenuInflater 對象
        //再調用它的inflate() 方法就可以給當前活動創建菜單了
        //inflate() 方法接收兩個參數,
        //第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
        //第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。

        return true;
        //返回true ,表示允許創建的菜單顯示出來
        //若返回了false ,創建的菜單將無法顯示。
    }

    //重寫onOptionsItemSelected方法,定義菜單的相應事件

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
            case R.id.add_item:
                Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
                break;
            case  R.id.remove_item:
                Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }


    ////////////////////////////////////////************************************///////

    //定義佈局
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
        //setContentView方法用於加載佈局
        //項目中添加的任何資源都會在R文件中生成一個相應的資源id
        // 因此,所創建的layout文件會自動將id添加到R文件中
        // 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id

        ///////////**********************///////////////
        Button button1=(Button) findViewById(R.id.button_1);
        //通過findViewById() 方法獲取到在佈局文件中定義的元素
        //在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
        //findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象

        button1.setOnClickListener(new View.OnClickListener() {
            @Override //表示重寫
            public void onClick(View v) {
//                Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android內部動作)
//                //構建出intent的“意圖”
//                intent.setData(Uri.parse("http://www.baidu.com"));
//               //通過Uri.parse() 方法,將一個網址字符串解析成一個Uri對象,
//                //再調用Intent的setData() 方法將這個Uri 對象傳遞進去
//                //setData()接收一個Uri 對象,主要用於指定當前Intent正在操作的數據,
//                // 而這些數據通常都是以字符串的形式傳入到Uri.parse() 方法中解析產生的

                //電話
                Intent intent=new Intent(Intent.ACTION_DIAL);//Intent的action 是Intent.ACTION_DIAL
                intent.setData(Uri.parse("tel:10086"));

                startActivity(intent);//啓動活動
            }
        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重寫
//            public void onClick(View v) {
//                Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
//                //構建出intent的“意圖”
//                intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
//                //調用Intent中的addCategory() 方法來添加一個category
//
//                startActivity(intent);//啓動活動
//            }
//        });


//        button1.setOnClickListener(new View.OnClickListener() {
//            @Override //表示重寫
//            public void onClick(View v) {
//                Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//                //構建出intent的“意圖”
//                startActivity(intent);//啓動活動
//            }
//        });



//        button1.setOnClickListener(new View.OnClickListener() {
//            //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
//            //點擊按鈕時就會執行監聽器中的onClick() 方法。
//            @Override //表示重寫
//            public void onClick(View v) {
//                Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
//                //通過靜態方法makeText() 創建出一個Toast對象
//                //並通過show()將Toast顯示出來
//
//                // makeText() 方法需要傳入3個參數。
//                // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
//                // 第二個參數是Toast顯示的文本內容,
//                // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
//            }
//        });

    }
}

有:

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章