1.Intent的定義
Intent這個(gè)單詞的意思就是"意圖,目的,意向",Intent是一種運(yùn)行時(shí)綁定(runtime binding)機(jī)制,它能在程序運(yùn)行的過程中連接兩個(gè)不同的組件。通過Intent,程序可以向Android表達(dá)某種請(qǐng)求或者意愿,Android會(huì)根據(jù)意愿的內(nèi)容選擇適當(dāng)?shù)慕M件來響應(yīng)。
Intent是由以下組件組成:
component(組件):目的組件
action(動(dòng)作):用來表現(xiàn)意圖的行動(dòng)
category(類別):用來表現(xiàn)動(dòng)作的類別,或范疇
data(數(shù)據(jù)):表示與動(dòng)作要操縱的數(shù)據(jù)
type(數(shù)據(jù)類型):對(duì)于data范例的描寫
extras(擴(kuò)展信息):擴(kuò)展信息
Flags(標(biāo)志位):期望這個(gè)意圖的運(yùn)行模式
Android官方定義Intent 是用于通過描述某個(gè)"意圖"對(duì)象中執(zhí)行的簡單操作(如“查看地圖”或“拍攝照片”)來啟動(dòng)另一應(yīng)用中的某個(gè) Activity。 這種 Intent 稱作"隱式"Intent,因?yàn)樗⒉恢付ㄒ獑?dòng)的應(yīng)用組件,而是指定一項(xiàng)"操作"并提供執(zhí)行該操作所需的一些數(shù)據(jù)。
當(dāng)調(diào)用 startActivity() 或 startActivityForResult()并向其傳遞隱式 Intent 時(shí),系統(tǒng)會(huì)將Intent解析為可處理該 Intent 的應(yīng)用并啟動(dòng)其對(duì)應(yīng)的 Activity。 如果有多個(gè)應(yīng)用可處理 Intent,系統(tǒng)會(huì)為用戶顯示一個(gè)對(duì)話框,供其選擇要使用的應(yīng)用。
注意:如果設(shè)備上沒有可接收隱式 Intent 的應(yīng)用,應(yīng)用將在調(diào)用 startActivity() 時(shí)崩潰。如需事先驗(yàn)證是否存在可接收 Intent 的應(yīng)用,需要對(duì) Intent對(duì)象調(diào)用 resolveActivity()。如果結(jié)果為非空,則至少有一個(gè)應(yīng)用能夠處理該 Intent,并且可以安全調(diào)用 startActivity(),如果結(jié)果為空,則不應(yīng)使用該 Intent。如有可能,應(yīng)停用調(diào)用該 Intent 的功能。
1.1.隱式Intent
舉個(gè)例子,某天你說"我想找個(gè)朋友打羽毛球"。你說的這句話就是一個(gè)隱式的意圖Intent,"打羽毛球"是隱式意圖Intent的一個(gè)Action,"我"是一個(gè)ActivityA,"朋友"是另外一個(gè)未知的ActivityB。要通過"打羽毛球"這個(gè)Action去找到這個(gè)"朋友",如果恰好我的朋友小王也想打羽毛球,那么"小王"就是這個(gè)具體的ActivityB,此時(shí),我們一拍即合,就能完成打羽毛球這項(xiàng)運(yùn)動(dòng)了,也就完成了一個(gè)隱式的Intent。
還有一種情況,如果小王,小張,小李都想和你打羽毛球,那么你只能從中選擇一個(gè)人和你打。也就是說ActivityA的過濾到ActivityB,ActivityC,ActivityD三個(gè)可啟動(dòng)的Activity,那么系統(tǒng)會(huì)彈出選擇框,只能選擇其中的一個(gè)Activity進(jìn)行啟動(dòng)。
1.2.顯示的Intent
舉個(gè)例子,某天你說"我想和小王打羽毛球"。此時(shí)"打羽毛球"是一個(gè)顯示意圖Intent,"我"是ActivityA,"小王"就是ActivityB,此時(shí),你不需要通過Action去匹配,只需直接和小王完成打羽毛球運(yùn)動(dòng)就成了,這也就完成了一個(gè)顯示的Intent。
2.Intent的簡單使用
這里介紹幾種可用于執(zhí)行常見操作的隱式 Intent,按處理 Intent 的應(yīng)用類型分成不同部分。 此外,每個(gè)部分還介紹如何創(chuàng)建 Intent 過濾器來公布應(yīng)用執(zhí)行相應(yīng)操作的能力。
2.1.相機(jī)
拍攝照片或視頻并將其返回
如需打開相機(jī)應(yīng)用并接收拍攝的照片或視頻,則使用 ACTION_IMAGE_CAPTURE或 ACTION_VIDEO_CAPTURE操作。此外,還可在 EXTRA_OUTPUT
extra 中指定相機(jī)將拍攝的照片或視頻保存到的 URI 位置。
示例
static final int REQUEST_IMAGE_CAPTURE = 1;
static final Uri mLocationForPhotos;
public void capturePhoto(String targetFilename) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.withAppendedPath(mLocationForPhotos, targetFilename));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bitmap thumbnail = data.getParcelable("data");
// Do other work with full size photo saved in mLocationForPhotos
...
}
}
2.2.打開特定設(shè)置
有時(shí)應(yīng)用要求用戶更改內(nèi)容時(shí)打開某個(gè)系統(tǒng)設(shè)置屏幕,請(qǐng)使用下列其中一個(gè) Intent 操作打開與操作名稱對(duì)應(yīng)的設(shè)置屏幕。
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS
示例
public void openWifiSettings() {
Intent intent = new Intent(Intent.ACTION_WIFI_SETTINGS);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
2.3.撰寫帶附件的短信/彩信
如需發(fā)起短信或彩信,則需使用以下其中一個(gè) Intent 操作,并使用下列 extra 鍵指定電話號(hào)碼、主題和消息正文等消息詳情。
ACTION_SENDTO或
ACTION_SEND或
ACTION_SEND_MULTIPLE
Extra
"subject"表示消息主題的字符串(通常只適用于彩信)。
"sms_body"表示消息正文的字符串。
EXTRA_STREAM指向要附加的圖像或視頻的Uri,如果使用的是ACTION_SEND_MULTIPLE操作,此 extra 應(yīng)為指向要附加的圖像/視頻的Uri ArrayList.
示例
public void composeMmsMessage(String message, Uri attachment) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType(HTTP.PLAIN_TEXT_TYPE);
intent.putExtra("sms_body", message);
intent.putExtra(Intent.EXTRA_STREAM, attachment);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
3.Intent的作用
雖然Intent不是Android四大組件之一,但I(xiàn)ntent作為Android的“信使”,在實(shí)際開發(fā)過程中也非常重要。例如啟動(dòng)Activity,啟動(dòng)Service,發(fā)送Broadcast,發(fā)送短信,從一個(gè)App啟動(dòng)另外一個(gè)App,獲取系統(tǒng)的聯(lián)系人,調(diào)用系統(tǒng)的地圖,調(diào)用系統(tǒng)的相機(jī),日歷,設(shè)置等等。