Android開發(fā)理解Intent的用途

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è)置等等陨享。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末葱淳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抛姑,更是在濱河造成了極大的恐慌赞厕,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件定硝,死亡現(xiàn)場離奇詭異皿桑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門诲侮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镀虐,“玉大人,你說我怎么就攤上這事浆西》鬯剑” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵近零,是天一觀的道長诺核。 經(jīng)常有香客問我,道長久信,這世上最難降的妖魔是什么窖杀? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮裙士,結(jié)果婚禮上入客,老公的妹妹穿的比我還像新娘。我一直安慰自己腿椎,他們只是感情好桌硫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啃炸,像睡著了一般铆隘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上南用,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天膀钠,我揣著相機(jī)與錄音,去河邊找鬼裹虫。 笑死肿嘲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筑公。 我是一名探鬼主播雳窟,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匣屡!你這毒婦竟也來了涩拙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤耸采,失蹤者是張志新(化名)和其女友劉穎兴泥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虾宇,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搓彻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旭贬。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡怔接,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稀轨,到底是詐尸還是另有隱情扼脐,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布奋刽,位于F島的核電站瓦侮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏佣谐。R本人自食惡果不足惜肚吏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狭魂。 院中可真熱鬧罚攀,春花似錦、人聲如沸雌澄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镐牺。三九已至炫掐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間任柜,已是汗流浹背卒废。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工沛厨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宙地,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓逆皮,卻偏偏與公主長得像宅粥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子电谣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容