1. 程式人生 > >Android:關於 Intent元件的那些小事(介紹、使用方法等)

Android:關於 Intent元件的那些小事(介紹、使用方法等)

前言

  • IntentAndroid開發的應用非常常見
  • 今天我就帶給大家簡單講一下Intent的相關知識 & 其用法

目錄

示意圖

1. 定義

意圖,描述的是應用的動作 & 其對應的資料

2. 作用

  1. 指定當前元件要完成的動作
  2. Android 不同元件間 傳遞資料

ActivityServiceBroadcastReceiver之間的通訊載體 = Intent

下面,將根據Intent的作用,詳細講解其使用方法

3. 使用1:指定當前元件要完成的動作

該使用 分為顯式 & 隱式意圖:

3.1 顯式意圖

  • 特點
    明確指定需啟動的元件名

即 顯式Intent

不需 解析Intent 則可直接啟動目標元件

  • 具體使用
    明確指定元件名的方式:呼叫Intent的構造方法、Intent.setComponent()Intent.setClass()

  • 例項說明

// 使FirstActivity啟動SecondActivity(通過按鈕)
mybutton.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // 1. 例項化顯式Intent & 通過建構函式接收2個引數
    // 引數1 = Context:啟動活動的上下文,一般為當前Activity
    // 引數2 = Class:是指定要啟動的目標活動
      Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    
    // 2. 通過Activity類的startActivity()執行該意圖操作(接收一個Intent物件)
    // 將構建好的Intent物件傳入該方法就可啟動目標Activity
      startActivity (intent);
    }
});

3.2 隱式意圖

  • 特點
    無明確指定需啟動的元件名,但 指定了需啟動元件需滿足的條件

即 隱式Intent需 解析Intent ,才可啟動目標元件

  • 具體使用
    通過 AndroidManifest.xml檔案下的<Activity>標籤下的<intent -filter> 宣告 需 匹配的條件

一個<Activity>標籤下可以有多組<intent -filter>,只需匹配其中1組即可

  • 詳細說明
    宣告條件含:動作(Action)、型別(Category)、資料(Data

示意圖

  • 例項說明
// 使FirstActivity啟動SecondActivity(通過按鈕)
      mybutton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // 1. 例項化1個隱式Intent物件,並指定action引數
	Intent intent = new Intent("android.intent.action.ALL_APPS");
       // 2. 呼叫Intent中的addCategory()來新增一個category
      // 注:每個Intent中只能指定1個action,但卻能指定多個category
  intent.addCategory("com.example.intent_test.MY_CATEGORY");
    	        startActivity (intent);
    }
});

// 為使SecondActivity能繼續響應該Intent
// 我們需在AndroidManifest.xml檔案下的<Activity>標籤下配置<intent -filter>的內容

<intent-filter >
      <action android:name="android.intent.action.ALL_APPS"/>
          <category android:name="android.intent.category.DEFAULT">        
          </category>
                <category android:name="com.example.intent_test.MY_CATEGORY"/>
            </intent-filter>

4. 使用2:不同元件間 傳遞資料

4.1 使用方法

putExtra()Bundle方式

4.2 可傳遞的資料型別

a. 8種基本資料型別(boolean byte char short int long float double)、String
b. IntentBundle
c. Serializable物件、Parcelable及其對應陣列、CharSequence 型別
d. ArrayList,泛型引數型別為:<Integer><? Extends Parcelable><Charsequence><String>

4.3 具體使用

在當前Activity把要傳遞的資料暫存在Intent中、在新啟動的Activity中取出Intent中的資料

  • 方法1:putExtra()
// 目的:將FristActivity中的一個字串傳遞到SecondActivity中,並在SecondActivity中將Intent物件中的資料(FristActivity傳遞過來的資料)取出

	// 1. 資料傳遞
	  // a. 建立Intent物件(顯示Intent)
	  Intent intent = new Intent(FirstActivity.this,SecondActivity.class);     
	 
	  // b. 通過putExtra()方法傳遞一個字串到SecondActivity;
	  // putExtra()方法接收兩個引數:第一個是鍵,第二個是值(代表真正要傳遞的資料)
	  intent.putExtra("data","I come from FirstActivity");
	  
	  // c. 啟動Activity
	  startActivity(intent);
	 
	// 2. 資料取出(在被啟動的Activity中)
	  // a. 獲取用於啟動SecondActivit的Intent
	  Intent intent = getIntent();
	  // b. 呼叫getStringExtra(),傳入相應的鍵名,就可得到傳來的資料
	  // 注意資料型別 與 傳入時保持一致
	  String data = intent.getStringExtra("data");
 

  • 方法2:Bundle
	// 1. 資料傳遞
	  // a. 建立Intent物件(顯示Intent)
	  Intent intent = new Intent(FirstActivity.this,SecondActivity.class);     
	 
	  // b. 建立bundle物件
	  Bundle bundle = new Bundle();

	  // c. 放入資料到Bundle
	  bundle.putString("name", "carson");
      bundle.putInt("age", 28);
	  
	  // d. 將Bundle放入到Intent中
	  intent.putExtras(bundle);

	  // e. 啟動Activity
	  startActivity(intent);

	// 2. 資料取出(在被啟動的Activity中)
	  // a. 獲取用於啟動SecondActivit的Intent
	  Intent intent = getIntent();

	  // b. 通過Intent獲取bundle
	  Bundle bundle = intent.getExtras();

	  // c. 通過bundle獲取資料傳入相應的鍵名,就可得到傳來的資料
	  // 注意資料型別 與 傳入時保持一致
	  String nameString = bundle.getString("name");
      int age = bundle.getInt("age");

4.4 兩種方式的區別

Bundle 意為 捆綁 的意思,更多適用於:

  • 連續傳遞資料
    若需實現連續傳遞:Activity A -> B -> C;若使用putExtra(),則需寫兩次intent = A->B先寫一遍 + 在B中取出來 & 再把值重新寫到Intent中再跳到C;若使用 Bundle,則只需取出 & 傳入 Bundle物件即可

  • 可傳遞的值:物件
    putExtra()無法傳遞物件,而 Bundle則可通過 putSerializable傳遞物件

但傳遞的物件要實現Serializable介面

// 如傳遞User類的物件

public class User implements Serializable {
    ...
}

// 傳遞時
User user = new User();
Intent intent = new Intent(MyActivity.this,OthereActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("user", user);
intent.putExtras(bundle);

putExtra()更多使用於單次傳遞、傳遞簡單資料型別的應用場景

5. 總結

  • 本文對Android中的Intent元件進行了全面的介紹
  • 接下來我將繼續介紹 Android開發中的相關知識,有興趣可以繼續關注Carson_Ho的安卓開發筆記

請幫頂 / 評論點贊!因為你的鼓勵是我寫作的最大動力!