Android:關於 Intent元件的那些小事(介紹、使用方法等)
前言
Intent
在Android
開發的應用非常常見- 今天我就帶給大家簡單講一下
Intent
的相關知識 & 其用法
目錄
1. 定義
意圖,描述的是應用的動作 & 其對應的資料
2. 作用
- 指定當前元件要完成的動作
- 在
Android
不同元件間 傳遞資料
Activity
、Service
、BroadcastReceiver
之間的通訊載體 =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. Intent
、Bundle
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的安卓開發筆記