1.Intent的定義
Intent這個單詞的意思就是"意圖慈省,目的憔维,意向"炬守,Intent是一種運(yùn)行時綁定(runtime binding)機(jī)制牧嫉,它能在程序運(yùn)行的過程中連接兩個不同的組件。通過Intent减途,程序可以向Android表達(dá)某種請求或者意愿酣藻,Android會根據(jù)意愿的內(nèi)容選擇適當(dāng)?shù)慕M件來響應(yīng)。
Intent是由以下組件組成:
component(組件):目的組件
action(動作):用來表現(xiàn)意圖的行動
category(類別):用來表現(xiàn)動作的類別鳍置,或范疇
data(數(shù)據(jù)):表示與動作要操縱的數(shù)據(jù)
type(數(shù)據(jù)類型):對于data范例的描寫
extras(擴(kuò)展信息):擴(kuò)展信息
Flags(標(biāo)志位):期望這個意圖的運(yùn)行模式
Android官方定義Intent 是用于通過描述某個"意圖"對象中執(zhí)行的簡單操作(如“查看地圖”或“拍攝照片”)來啟動另一應(yīng)用中的某個 Activity辽剧。 這種 Intent 稱作"隱式"Intent,因?yàn)樗⒉恢付ㄒ獑拥膽?yīng)用組件税产,而是指定一項(xiàng)"操作"并提供執(zhí)行該操作所需的一些數(shù)據(jù)怕轿。
當(dāng)調(diào)用 startActivity() 或 startActivityForResult()并向其傳遞隱式 Intent 時,系統(tǒng)會將Intent解析為可處理該 Intent 的應(yīng)用并啟動其對應(yīng)的 Activity辟拷。 如果有多個應(yīng)用可處理 Intent撞羽,系統(tǒng)會為用戶顯示一個對話框,供其選擇要使用的應(yīng)用衫冻。
注意:如果設(shè)備上沒有可接收隱式 Intent 的應(yīng)用放吩,應(yīng)用將在調(diào)用 startActivity() 時崩潰。如需事先驗(yàn)證是否存在可接收 Intent 的應(yīng)用羽杰,需要對 Intent對象調(diào)用 resolveActivity()渡紫。如果結(jié)果為非空到推,則至少有一個應(yīng)用能夠處理該 Intent,并且可以安全調(diào)用 startActivity()惕澎,如果結(jié)果為空莉测,則不應(yīng)使用該 Intent。如有可能唧喉,應(yīng)停用調(diào)用該 Intent 的功能捣卤。
1.1.隱式Intent
舉個例子,某天你說"我想找個朋友打羽毛球"八孝。你說的這句話就是一個隱式的意圖Intent董朝,"打羽毛球"是隱式意圖Intent的一個Action,"我"是一個ActivityA干跛,"朋友"是另外一個未知的ActivityB子姜。要通過"打羽毛球"這個Action去找到這個"朋友",如果恰好我的朋友小王也想打羽毛球楼入,那么"小王"就是這個具體的ActivityB哥捕,此時,我們一拍即合嘉熊,就能完成打羽毛球這項(xiàng)運(yùn)動了遥赚,也就完成了一個隱式的Intent。
還有一種情況阐肤,如果小王凫佛,小張,小李都想和你打羽毛球孕惜,那么你只能從中選擇一個人和你打御蒲。也就是說ActivityA的過濾到ActivityB,ActivityC诊赊,ActivityD三個可啟動的Activity厚满,那么系統(tǒng)會彈出選擇框,只能選擇其中的一個Activity進(jìn)行啟動碧磅。
1.2.顯示的Intent
舉個例子碘箍,某天你說"我想和小王打羽毛球"。此時"打羽毛球"是一個顯示意圖Intent鲸郊,"我"是ActivityA丰榴,"小王"就是ActivityB,此時秆撮,你不需要通過Action去匹配四濒,只需直接和小王完成打羽毛球運(yùn)動就成了,這也就完成了一個顯示的Intent。
2.Intent的簡單使用
這里介紹幾種可用于執(zhí)行常見操作的隱式 Intent盗蟆,按處理 Intent 的應(yīng)用類型分成不同部分戈二。 此外,每個部分還介紹如何創(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è)置
有時應(yīng)用要求用戶更改內(nèi)容時打開某個系統(tǒng)設(shè)置屏幕,請使用下列其中一個 Intent 操作打開與操作名稱對應(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ā)起短信或彩信徙硅,則需使用以下其中一個 Intent 操作,并使用下列 extra 鍵指定電話號碼搞疗、主題和消息正文等消息詳情嗓蘑。
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ā)過程中也非常重要。例如啟動Activity瘤礁,啟動Service阳懂,發(fā)送Broadcast,發(fā)送短信柜思,從一個App啟動另外一個App岩调,獲取系統(tǒng)的聯(lián)系人,調(diào)用系統(tǒng)的地圖赡盘,調(diào)用系統(tǒng)的相機(jī)号枕,日歷,設(shè)置等等陨享。