Android學習隨筆(2)------Intent基本用法

學習流程來自《第一行代碼》(第二版)
一個Android應用不可能只有一個活動 活動與活動之間的切換,使用的是Intent。

顯示Intent

主要實現的功能爲:主活動命名爲FirstActivity,點擊Button跳轉到SecondActivity活動。
在FirstActivity中創建一個button1

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
    android:id="@+id/button_1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Button_1"
    /><!--  id=給當前元素定義一個唯一標識符
            layout_width=當前元素的寬度 與父元素一樣寬
            layout_height=當前元素的高度 剛好顯示文字
            text=元素中顯示的文字內容-->
</LinearLayout>    <!--創建的first_layout時候選擇了LinearLayout爲根元素!-->

Exler
在AndroidManifest.xml中註冊FirstActivity和SecondAndroid頁面

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yezhou.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=".FirstActivity"
            android:launchMode="singleTask"
            android:label="This is FirstActivity">
            <intent-filter> <!-- 不是主活動不需要配置 -->
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity">
        </activity>
    </application>

</manifest>

利用FirstActivity中button的鼠標點擊事件來打開SecondActivity 這裏就要用到Intent。

Intent有很多個構造參數,比較簡單的是Intent(Context packageContext, Class cls),第一個參數指的是 提供一個啓動活動的上下文,也就是當前的java文件FirstActivity.this,第二個就是要跳轉的活動,這裏是SecondActivity.class。專門用於啓動活動的方法爲startActivity(),傳入已經創建好的Intent對象即可。

 Button button1 = (Button) findViewById(R.id.button_1);    // 找到定義元素
 button1.setOnClickListener(new View.OnClickListener() {    // 爲Button1註冊一個監聽器
     @Override
     public void onClick(View v){
         Intent intent = new Intent(FirstActivity.this,SecondActivity.class);    // 啓動活動的上下文,要啓動活動的class
         startActivity(intent);    // 啓動活動    !--顯式Intent
     }
 }

這時運行虛擬機,點擊button就可以跳轉到SecondActivity。

隱式Intent

不明確指定由哪個Activity去響應FirstActivity裏的按鈕點擊事件。
(爲了更好的理解可以創建一個ThirdActivity,由它去響應此事件)

先在AndroidManifest.xml中對三個Activity進行註冊:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yezhou.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=".FirstActivity"
            android:launchMode="singleTask"
            android:label="This is FirstActivity">
            <intent-filter> <!-- 不是主活動不需要配置 -->
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity">
        </activity>
        <activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="com.example.yezhou.activitytest.ACTION_START" />

                <category android:name="android.intent.category.DEFAULT" /> <!-- 只有<action><category>同時匹配上Intent中指定的action和category時這個活動才能響應該Intent -->
            </intent-filter>
        </activity>
    </application>
</manifest>

修改FirstActivity中button的點擊事件

button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v){
        Intent intent = new Intent("com.example.yezhou.activitytest.ACTION_START");
        startActivity(intent);    // 自動將默認category添加
    }
}

運行,這時你會發現點擊按鈕打開的是ThirdActivity
應爲對ThirdActivity的註冊中category屬性爲

<category android:name="android.intent.category.DEFAULT" />

這是一種默認的category,在調用startActivity()方法時會自動將其添加。


可以在AndroidManifest.xml文件中修改SecondActivity的註冊文件:

<activity android:name=".SecondActivity"
            android:launchMode="singleInstance">
    <intent-filter>
        <action android:name="com.example.yezhou.activitytest.ACTION_START" />
        <category android:name="com.example.yezhou.activitytest.MY_CATEGORY" />
    </intent-filter>
</activity>

接着在button的點擊事件中

Button button1 = (Button) findViewById(R.id.button_1);    // 找到定義元素
button1.setOnClickListener(new View.OnClickListener() {    // 爲Button1註冊一個監聽器
    @Override
    public void onClick(View v){
        Intent intent = new Intent("com.example.yezhou.activitytest.ACTION_START");
        intent.addCategory("com.example.yezhou.activitytest.MY_CATEGORY");    // 添加一個指定的category值                                               
        startActivity(intent);
    }
}

運行,這時SecondActivity會來響應我們的點擊事件,因爲只有SecondActivity的action,category的值才能與button中指定的對得上號,所以由SecondActiviy來隱式響應。

有的時候我們還會調用其他的軟件來響應接下去的事件,比如說打開一個網頁這時只要修改FirstActivity.java中button的點擊事件即可。

Button button1 = (Button)findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.baidu.com"));
        startActivity(intent);
    }
}             

調用系統的瀏覽器來打開百度。

不僅如此還可以響應別的軟件的網頁請求
在AndroidManifest.xml中的intent-filteri標籤的data屬性設置要用來響應其他軟件Intent的http協議。
這裏我們來實現點擊FirstActivity中的button由SecondActivity來響應它。
在AndroidManifest.xml中SecondActivity的標籤裏面加上

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <data android:scheme="http" />
</intent-filter>

這時我們運行程序,點擊button
Exler
我們會發現TWO來響應我們http的請求了。
除了http協議外還可以指定很多其他協議

Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v){
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("tel:10000"));   
        startActivity(intent);
    }
}

Exler

響應一個data uri爲http的activity geo表示地理位置 tel表示撥打電話

傳遞數據的活動切換

向下一個活動傳遞參數

在button的點擊事件中

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);    
intent.putExtra("extra_data","Hello SecondActivity");    // 傳遞一個值給下一個activity
startActivity(intent);    // 啓動活動  

“extra_data”是鍵,而後面那個參數是值

在SecondActivity頁面來輸出“Hello SecondActivity”

    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_layout);
    Intent intent = getIntent();
    Log.d("SecondActivity",intent.getStringExtra("extra_data"));    // 顯示上一個活動傳遞進來的值

Exler

返回數據給上一個活動
有了向下傳遞那麼也必定有向上傳遞

在FirstActivity中修改button打開SecondActivity 的方式

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);    // 期望在活動銷燬時能夠返回一個結果給上一個活動 由於 SecondActivity是用此方法啓動的,所以被銷燬之後會回調上一個活動的onActivityResult方法,所以需要重寫此方法
startActivity(intent);    // 啓動活動

使用startActivityForResult()方法來啓動SecondActivity,請求碼只要是一個唯一的值即可。
在SecondActivity活動中添加一個button

Button button2 = (Button)findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent();
        intent.putExtra("data_return","Hello FirstActivity");    // 需要傳遞的數據
        setResult(RESULT_OK,intent);    // 用於向上一個activity返回數據的
        finish();
    }
}

雖然我們還是創建了一個Intent,但是這個intent並沒有明確指定,點擊了button後該切換到哪個界面。
這裏的intent僅用於傳遞數據,調用setResult()方法 第一個參數用於向上一個活動返回處理結果,一般RESULT_OK或RESULT_CANCELED,第二個參數則把帶有數據的 intent傳遞回去。finish()方法來銷燬當前活動。
應爲FirstActivity是被回掉的對象,那麼需要重寫它的onActivityResult()方法

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK)
                  Log.d("FirstActivity",data.getStringExtra("data_return"));
                break;
            default:
        }
    }

第一個參數就是我們在啓動那個被銷燬的活動時傳入的請求碼(判斷數據來源),第二個參數即是在SecondActivity返回數據時的處理結果(是否成功),第三個參數就是intent。
運行先點擊button來到SecondActivity,接着點擊SecondActivity中的button
Exler
可以看到FirstActivity成功的接收到了SecondActivity傳遞的值。

但如果用戶是在SecondActivity直接點擊了back鍵來返回FirstActivity的需要重寫SecondActivity中的onBackPressde()方法

@Override
    public void onBackPressed() {
        Intent intent = new Intent();
        intent.putExtra("data_return","Hello FirstActivity");
        setResult(RESULT_OK);
        finish();
    }

此博文爲個人學習筆記,僅供個人學習使用,希望對大家有幫助。

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