注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術(shù)一般,由于喜愛安卓而產(chǎn)生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/basics/intents/sending.html
Android的一個最重的特性就是一個應(yīng)用可以將用戶帶領(lǐng)到另一個應(yīng)用的能力,這一切基于的是一個應(yīng)用期望表現(xiàn)的“ 行為(action) ”。例如,如果你的應(yīng)用有一個你期望顯示在地圖上的地址,你不需要在你的應(yīng)用中構(gòu)建一個顯示地圖的Activity,你只需要通過使用 Intent 來創(chuàng)建一個查勘地址的需求。之后Android系統(tǒng)會自動啟動一個可以在地圖上顯示地址的應(yīng)用。
如同在第一節(jié)課 Building Your First App (博客鏈接: http://www.cnblogs.com/jdneo/p/3438954.html )所說的,你必須使用intents在你的應(yīng)用的Activity之間轉(zhuǎn)換。一般你通過顯示intent來做這件事情,這將指明你希望啟動的組件的類名。然而,當(dāng)你希望通過另一個應(yīng)用執(zhí)行一個行為,比如“查看地圖”,你就必須使用一個隱式的intent。
這節(jié)課將向你展示如何為一個特定的行為創(chuàng)建一個隱式intent,以及如何使用它啟動一個其它應(yīng)用的Activity來執(zhí)行這個行為。
?
一). 構(gòu)建一個隱式的Intent
隱式Intent不聲明要啟動組件的類名,而是聲明一個要執(zhí)行的行為。該行為指定了你希望做的事情,比如查看,編輯,發(fā)送或者獲取某些東西。Intents也經(jīng)常包含與該行為有關(guān)的數(shù)據(jù),比如你希望查看的地址,或者你希望發(fā)送的郵件內(nèi)容。根據(jù)你希望創(chuàng)建intent,數(shù)據(jù)可以是一個 Uri ,也可以其他的數(shù)據(jù)類型,當(dāng)然intent也可以不需要任何數(shù)據(jù)。
如果你的數(shù)據(jù)是一個
Uri
,有一個你可以使用的
Intent()
構(gòu)造函數(shù)來定義行為和數(shù)據(jù)。
下述例子是如何使用 Uri 數(shù)據(jù)指定電話號碼來創(chuàng)建一個intent,從而初始化一個打電話行為
Uri number = Uri.parse("tel:5551234" ); Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
當(dāng)你的應(yīng)用通過調(diào)用 startActivity() 行使了這個intent,撥號應(yīng)用會根據(jù)給定的電話號碼初始化一個呼叫。
下面是一些其他intent的例子,以及它們所對應(yīng)的行為和 Uri 數(shù)據(jù)對:
- 瀏覽地圖:
// 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)頁:
Uri webpage = Uri.parse("http://www.android.com" ); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
其它類型的隱式Intents需要“ extra ”數(shù)據(jù)來提供不同的數(shù)據(jù)類型,比如字符串。你通過使用不同的 putExtra() 方法來添加一個或多個“ extra ”數(shù)據(jù)。
默認(rèn)的,系統(tǒng)會基于intent所包含的
Uri
數(shù)據(jù),來指定它所需要的恰當(dāng)MIME類型。如果你在intent中不包含一個
Uri
,你應(yīng)該使用
setType()
來指定與該intent所關(guān)聯(lián)的數(shù)據(jù)類型。設(shè)置MIME類型會進(jìn)一步特定什么類型的Activity將會接受這個intent。
下面是一些intent例子,它們通過添加額外的數(shù)據(jù)來定義希望的行為:
- 發(fā)送一個有附件的Email:
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");
Note:
這個日歷事件的Intent僅在API Level 14或更高的平臺上被支持。
Note:
將你的 Intent 定義的越明確越好!例如,如果你希望使用 ACTION_VIEW 的intent來展示一個圖片,你應(yīng)該特定MIME類型為“ image/* ”。這將防止可以查看其他數(shù)據(jù)類型的應(yīng)用(比如一個地圖閱覽器)被這個intent激活。
?
二). 確認(rèn)有一個應(yīng)用能接受此Intent
雖然Android平臺保證某個Intent將會由一個內(nèi)置的應(yīng)用所處理(比如:電話,電子郵件或者日歷等應(yīng)用),但是你在激活一個intent前包含一個確認(rèn)的步驟。
Caution:
如果你激活了一個在設(shè)備中沒有任何一個應(yīng)用能夠處理該事務(wù)的intent,那么你的應(yīng)用將會崩潰。
為了確認(rèn)有一個應(yīng)用能夠正確響應(yīng)這個intent,調(diào)用
queryIntentActivities()
來得到一個能夠處理你的
Intent
的activity清單。如果返回的
List
不為空,你可以安全地使用這個intent。例如:
PackageManager packageManager = getPackageManager(); List <ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0 ); boolean isIntentSafe = activities.size() > 0;
如果 isIntentSafe為真,那就說明至少有一個應(yīng)用能夠正確響應(yīng)這個intent。如果為假,那就說明沒有任何應(yīng)用能夠處理這個intent。
Note:
你應(yīng)該在你的應(yīng)用第一次啟動時執(zhí)行這個檢查,這樣你就可以禁用使用該intent的功能特性,防止用戶嘗試去使用它。如果你知道某個特定的應(yīng)用能夠處理這個intent,你也可以給用戶提供鏈接來讓用戶下載這個應(yīng)用(可也查閱: link to your product on Google Play )
?
三). 通過Intent啟動一個Activity
一旦你創(chuàng)建了你的 Intent 并且設(shè)置了額外的信息,你可以調(diào)用 startActivity() 將它發(fā)送給系統(tǒng)。如果系統(tǒng)發(fā)現(xiàn)有不止一個acitivity可以處理這個intent,它會向用戶顯示一個對話框,讓用戶選擇要啟動哪一個應(yīng)用,如圖1所示。如果只有一個應(yīng)用能夠處理這個intent,那么系統(tǒng)會立即直接啟動它。
startActivity(intent);
圖1. 當(dāng)有多個應(yīng)用能夠處理該intent時,系統(tǒng)所顯示的選擇對話框
下面是一個完整的例子,它顯示了如何創(chuàng)建一個intent來瀏覽一個地圖,然后確認(rèn)是否存在應(yīng)用能夠處理它,然后啟動它:
// Build the intent Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California" ); Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); // Verify it resolves PackageManager packageManager = getPackageManager(); List <ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0 ); boolean isIntentSafe = activities.size() > 0 ; // Start an activity if it's safe if (isIntentSafe) { startActivity(mapIntent); }
?
四). 顯示一個應(yīng)用選擇器(App Chooser)
注意到當(dāng)你將你的 Intent 傳遞給 startActivity() 來啟動一個Activity時,如果有多個應(yīng)用可以正確響應(yīng)這個intent,用戶可以選擇默認(rèn)使用哪個程序(在對話框底部勾選復(fù)選框,見圖1)。當(dāng)用戶每次都希望使用相同的應(yīng)用來處理該事務(wù)時(比如打開一個網(wǎng)頁時,用戶可能會喜歡只用一個瀏覽器,或者拍攝一個照片,用戶可能只喜歡用一款相機(jī)應(yīng)用),此時這么做是不錯的。
然而,如果這個intent行為可以被多個應(yīng)用處理,同時,用戶每次可能期望使用不同的應(yīng)用——比如“ 分享 ”這一行為,用戶可能有多個應(yīng)用能夠分享某一個項(xiàng)目。此時你應(yīng)該顯式地展現(xiàn)一個選擇應(yīng)用的對話框,如圖2所示。這個對話框強(qiáng)制用戶在每次執(zhí)行該操作時,選擇一個自己期望的應(yīng)用來處理該事務(wù)(用戶不能選擇一個默認(rèn)的應(yīng)用來處理)。
圖2. 一個應(yī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 and start the chooser Intent chooser = Intent.createChooser(intent, title); startActivity(chooser);
這樣將會顯示一個對話框,里面顯示了能夠處理傳遞給 createChooser() 的intent的應(yīng)用清單,對話框的標(biāo)題是代碼中指定的文本。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
