與其他應(yīng)用交互之簡(jiǎn)單使用Intent

向另一個(gè)應(yīng)用發(fā)送數(shù)據(jù)

Android 最重要的功能之一是應(yīng)用能夠基于它要執(zhí)行的“操作”向另一個(gè)應(yīng)用發(fā)送數(shù)據(jù)冤灾。 例如只恨,如果您的應(yīng)用有您要在地圖上顯示的公司地址滤钱,您無(wú)需在顯示地圖的應(yīng)用中構(gòu)建 Activity幢踏。 而是可以創(chuàng)建使用 Intent 查看地址的請(qǐng)求。Android 系統(tǒng)之后啟動(dòng)可以在地圖上顯示該地址的應(yīng)用玻褪。
您必須使用 Intent 在自己應(yīng)用中的 Activity 之間進(jìn)行導(dǎo)航。 您通常使用顯式 Intent 執(zhí)行此操作公荧,該 Intent 定義您希望啟動(dòng)的組件的確切類(lèi)名稱(chēng)带射。 但是,當(dāng)您希望另一應(yīng)用執(zhí)行操作時(shí)循狰,比如“查看地圖”窟社,您必須使用隱式 Intent。

本博文向您展示如何針對(duì)特定操作創(chuàng)建隱式 Intent绪钥,以及如何使用該 Intent 啟動(dòng)在另一個(gè)應(yīng)用中執(zhí)行操作的 Activity灿里。

構(gòu)建隱式 Intent

隱式 Intent 不聲明要啟動(dòng)的組件的類(lèi)名稱(chēng),而是聲明要執(zhí)行的操作程腹。 該操作指定您要執(zhí)行的操作匣吊,比如查看、編輯寸潦、發(fā)送或 獲取 某項(xiàng)色鸳。 Intent 通常還包含與操作關(guān)聯(lián)的數(shù)據(jù),比如您要查看的地址或您要發(fā)送的電子郵件消息见转。根據(jù)要?jiǎng)?chuàng)建的 Intent命雀,數(shù)據(jù)可能是 Uri、多種其他數(shù)據(jù)類(lèi)型之一斩箫,或 Intent 可能根本就不需要數(shù)據(jù)吏砂。
如果您的數(shù)據(jù)是 Uri撵儿,您可以使用一個(gè)簡(jiǎn)單的 Intent() 構(gòu)造函數(shù)來(lái)定義操作和數(shù)據(jù)。

例如狐血,此處顯示如何使用指定電話(huà)號(hào)碼的 Uri 數(shù)據(jù)創(chuàng)建發(fā)起電話(huà)呼叫的 Intent:

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

當(dāng)您的應(yīng)用通過(guò)調(diào)用 startActivity() 調(diào)用此 Intent 時(shí)统倒,“電話(huà)”應(yīng)用會(huì)發(fā)起向指定電話(huà)號(hào)碼的呼叫。

這里有一些其他 Intent 及其操作和 Uri 數(shù)據(jù)對(duì):

查看地圖:

// Map point based on address
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based on latitude/longitude
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

查看網(wǎng)頁(yè):

Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

其他類(lèi)型的隱式 Intent 需要提供不同數(shù)據(jù)類(lèi)型(比如氛雪,字符串)的“額外”數(shù)據(jù)房匆。 您可以使用各種 putExtra() 方法添加一條或多條 extra 數(shù)據(jù)。

默認(rèn)情況下报亩,系統(tǒng)基于所包含的 Uri 數(shù)據(jù)確定 Intent 需要的相應(yīng) MIME 類(lèi)型浴鸿。如果您未在 Intent 中包含 Uri,您通常應(yīng)使用 setType() 指定與 Intent 關(guān)聯(lián)的數(shù)據(jù)的類(lèi)型弦追。 設(shè)置 MIME 類(lèi)型可進(jìn)一步指定哪些類(lèi)型的 Activity 應(yīng)接收 Intent岳链。

此處有更多添加額外數(shù)據(jù)以指定所需操作的 Intent:

發(fā)送帶附件的電子郵件:

Intent emailIntent = new Intent(Intent.ACTION_SEND);
// The intent does not have a URI, so declare the "text/plain" MIME type
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
// You can also attach multiple items by passing an ArrayList of Uris

創(chuàng)建日歷事件:

Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");

注:只有 API 級(jí)別 14 或更高級(jí)別支持此日歷事件 Intent。
注:盡可能具體地定義您的 Intent 非常重要劲件。例如掸哑,如果您想要使用 ACTION_VIEW Intent 顯示圖像,您應(yīng)指定 MIME 類(lèi)型 image/*零远。這可防止可“查看”數(shù)據(jù)的其他類(lèi)型的應(yīng)用(比如地圖應(yīng)用)被 Intent 觸發(fā)苗分。

驗(yàn)證是否存在接收 Intent 的應(yīng)用

盡管 Android 平臺(tái)保證某些 Intent 可以分解為內(nèi)置應(yīng)用之一(比如,“電話(huà)”牵辣、“電子郵件”或“日歷”應(yīng)用)摔癣,您應(yīng)在調(diào)用 Intent 之前始終包含確認(rèn)步驟。
注意:如果您調(diào)用了 Intent纬向,但設(shè)備上沒(méi)有可用于處理 Intent 的應(yīng)用择浊,您的應(yīng)用將崩潰。
要確認(rèn)是否存在可響應(yīng) Intent 的可用 Activity逾条,請(qǐng)調(diào)用 queryIntentActivities() 來(lái)獲取能夠處理您的 Intent 的 Activity 列表琢岩。如果返回的 List 不為空,您可以安全地使用該 Intent师脂。例如:

PackageManager packageManager = [getPackageManager()](https://developer.android.google.cn/reference/android/content/Context.html#getPackageManager())
;List activities = packageManager.queryIntentActivities(intent,        PackageManager.MATCH_DEFAULT_ONLY);boolean isIntentSafe = activities.size() > 0;

如果 isIntentSafe 是 true担孔,則至少有一個(gè)應(yīng)用將響應(yīng)該 Intent。 如果它是 false危彩,則沒(méi)有任何應(yīng)用處理該 Intent攒磨。
注:在您需要在用戶(hù)嘗試使用它之前停用使用該 Intent 的功能時(shí),您應(yīng)在 Activity 初次啟動(dòng)時(shí)執(zhí)行此檢查汤徽。 如果您了解可處理 Intent 的特定應(yīng)用娩缰,您還可以為用戶(hù)提供下載該應(yīng)用的鏈接(請(qǐng)參閱如何在 Google Play 鏈接到您的產(chǎn)品)

啟動(dòng)具有 Intent 的 Activity

一旦您已創(chuàng)建您的 Intent 并設(shè)置 extra 信息,調(diào)用 startActivity() 將其發(fā)送給系統(tǒng)谒府。如果系統(tǒng)識(shí)別可處理 Intent 的多個(gè) Activity拼坎,它會(huì)為用戶(hù)顯示對(duì)話(huà)框供其選擇要使用的應(yīng)用浮毯,如圖 1 所示。如果只有一個(gè) Activity 處理 Intent泰鸡,系統(tǒng)會(huì)立即將其啟動(dòng)债蓝。

startActivity(intent);

此處顯示完整的示例:如何創(chuàng)建查看地圖的 Intent,驗(yàn)證是否存在處理 Intent 的應(yīng)用盛龄,然后啟動(dòng)它:

// Build the intentUri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);// Verify it resolvesPackageManager packageManager = [getPackageManager()](https://developer.android.google.cn/reference/android/content/Context.html#getPackageManager())
;List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);boolean isIntentSafe = activities.size() > 0;// Start an activity if it's safeif (isIntentSafe) {    startActivity(mapIntent);}

顯示應(yīng)用選擇器

注意饰迹,當(dāng)您通過(guò)將您的 Intent 傳遞至 startActivity() 而啟動(dòng) Activity 時(shí),有多個(gè)應(yīng)用響應(yīng) Intent余舶,用戶(hù)可以選擇默認(rèn)使用哪個(gè)應(yīng)用(通過(guò)選中對(duì)話(huà)框底部的復(fù)選框啊鸭;見(jiàn)圖 1)。當(dāng)執(zhí)行用戶(hù)通常希望每次使用相同應(yīng)用進(jìn)行的操作時(shí)匿值,比如當(dāng)打開(kāi)網(wǎng)頁(yè)(用戶(hù)可能只使用一個(gè)網(wǎng)絡(luò)瀏覽器)或拍照(用戶(hù)可能習(xí)慣使用一個(gè)相機(jī))時(shí)赠制,這非常有用。

但是挟憔,如果要執(zhí)行的操作可由多個(gè)應(yīng)用處理并且用戶(hù)可能 習(xí)慣于每次選擇不同的應(yīng)用 — 比如“共享”操作钟些, 用戶(hù)有多個(gè)應(yīng)用分享項(xiàng)目 — 您應(yīng)明確顯示選擇器對(duì)話(huà)框, 如圖 2 所示绊谭。選擇器對(duì)話(huà)框 強(qiáng)制用戶(hù)選擇用于每次操作的 應(yīng)用(用戶(hù)不能對(duì)此操作選擇默認(rèn)的應(yīng)用)政恍。

要顯示選擇器,請(qǐng)使用 createChooser() 創(chuàng)建Intent 并將其傳遞給 startActivity()龙誊。例如:

Intent intent = new Intent(Intent.ACTION_SEND);
...

// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show chooser
Intent chooser = Intent.createChooser(intent, title);

// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

這將顯示一個(gè)對(duì)話(huà)框抚垃,其中包含響應(yīng)傳遞給 createChooser() 方法的 Intent 的應(yīng)用列表,并且將提供的文本用作對(duì)話(huà)框標(biāo)題趟大。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铣焊,隨后出現(xiàn)的幾起案子逊朽,更是在濱河造成了極大的恐慌,老刑警劉巖曲伊,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叽讳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坟募,警方通過(guò)查閱死者的電腦和手機(jī)岛蚤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)懈糯,“玉大人涤妒,你說(shuō)我怎么就攤上這事∽” “怎么了她紫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵硅堆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我贿讹,道長(zhǎng)渐逃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任民褂,我火速辦了婚禮茄菊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赊堪。我一直安慰自己面殖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布雹食。 她就那樣靜靜地躺著畜普,像睡著了一般。 火紅的嫁衣襯著肌膚如雪群叶。 梳的紋絲不亂的頭發(fā)上吃挑,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音街立,去河邊找鬼舶衬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赎离,可吹牛的內(nèi)容都是我干的逛犹。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梁剔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虽画!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起荣病,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤码撰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后个盆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脖岛,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年颊亮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柴梆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡终惑,死狀恐怖绍在,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤揣苏,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布悯嗓,位于F島的核電站,受9級(jí)特大地震影響卸察,放射性物質(zhì)發(fā)生泄漏脯厨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一坑质、第九天 我趴在偏房一處隱蔽的房頂上張望合武。 院中可真熱鬧,春花似錦涡扼、人聲如沸稼跳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)汤善。三九已至,卻和暖如春票彪,著一層夾襖步出監(jiān)牢的瞬間红淡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工降铸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留在旱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓推掸,卻偏偏與公主長(zhǎng)得像桶蝎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谅畅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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