Android官方开发文档Training系列课程中文版:与其它APP交互之允许其它APP启动你的Activity
原文地址:http://android.xsoftlab.net/training/basics/intents/filters.html
在前兩節(jié)課程中我們只關(guān)注了事情的一面:從你的APP啟動(dòng)其它APP。但是如果你的APP可以執(zhí)行一些功能,并且這些功能可以被其它APP所利用,那么你可以做一個(gè)功能來響應(yīng)其它APP的請(qǐng)求。舉個(gè)例子,如果你構(gòu)建了一個(gè)社交APP并且可以給用戶的朋友分享消息或者照片,那么這是支持ACTION_SEND意圖的最佳興趣點(diǎn),所以用戶可以從其它APP中啟動(dòng)一個(gè)”share”行為,然后啟動(dòng)你的APP來完成這個(gè)功能。
為了允許其它APP可以啟動(dòng)你的Activity,你需要添加一個(gè)< intent-filter>元素標(biāo)簽到清單文件中的對(duì)應(yīng)的< activity>標(biāo)簽元素下。
當(dāng)APP被安裝到設(shè)備上之后,系統(tǒng)會(huì)識(shí)別你的意圖過濾器,并且添加該信息到所有支持的內(nèi)部意圖目錄中。當(dāng)APP使用了隱式意圖調(diào)用了startActivity()或startActivityForResult(),那么系統(tǒng)會(huì)尋找那些activity可以響應(yīng)這個(gè)意圖。
添加意圖過濾器
為了可以適當(dāng)?shù)亩xActivity可以處理哪一種意圖,你添加每一個(gè)意圖過濾器應(yīng)該盡可能的指明activity可以接受的行為類型和數(shù)據(jù)類型。
系統(tǒng)可能通過給定的Intent發(fā)送到activity,如果這個(gè)activity有一個(gè)意圖過濾器正好可以完全匹配以下的Intent對(duì)象標(biāo)準(zhǔn):
Action:
這個(gè)行為可以執(zhí)行的名稱。通常平臺(tái)上定義的值比如是ACTION_SEND或ACTION_VIEW。
在意圖過濾器中使用< action>元素標(biāo)簽來指定該值。該值必須是這個(gè)行為的全稱,而不是API常量(請(qǐng)看下面的例子)。
Data:
有關(guān)這個(gè)意圖的數(shù)據(jù)描述。
在意圖過濾器中使用< data>元素標(biāo)簽指定該值。使用該元素的更多屬性,你可以僅僅指定MIME類型,URI前綴類型,URI計(jì)劃類型,或者這些類型的組合,以及可以接收的其它數(shù)據(jù)類型。
Note:如果你不需要聲明Uri數(shù)據(jù)的指定類型(比如你的activity處理其它種類的附加數(shù)據(jù),而不是URI),你應(yīng)該通過android:mimeType屬性聲明activity可以處理的數(shù)據(jù)類型,比如text/plain或者image/jpeg。
Category:
提供了一種附加方式來描述activity處理intent,通常與啟動(dòng)的用戶手勢(shì)或者位置有關(guān)。這里有幾個(gè)系統(tǒng)支持的不同的分類,但是大多數(shù)是很少使用的。然而,所有的隱式意圖會(huì)在默認(rèn)情況下使用CATEGORY_DEFAULT定義。
可以在意圖過濾器中使用< category>元素標(biāo)簽指定該值。
在意圖過濾器中,你可以通過在意圖過濾器中使用相應(yīng)的XML元素來聲明activity可以接收的意圖標(biāo)準(zhǔn)。
舉個(gè)例子,這里的activity可以處理ACTION_SEND意圖,當(dāng)數(shù)據(jù)類型為文本或者圖像時(shí)。
<activity android:name="ShareActivity"><intent-filter><action android:name="android.intent.action.SEND"/><category android:name="android.intent.category.DEFAULT"/><data android:mimeType="text/plain"/><data android:mimeType="image/*"/></intent-filter> </activity>每個(gè)到來的Intent都只會(huì)指定一個(gè)行為和一個(gè)數(shù)據(jù)類型,但是在每一個(gè)過濾器中聲明多個(gè)< action>,< category>,和< data>元素的話,這就沒問題了。
如果任意的兩對(duì)行為和數(shù)據(jù)會(huì)在他們的行為中相互排斥的話,你應(yīng)該創(chuàng)建單獨(dú)的意圖過濾器來指明哪個(gè)行為可以接收,當(dāng)也匹配到相應(yīng)的數(shù)據(jù)類型時(shí)。
舉個(gè)例子,假設(shè)activity在ACTION_SEND行為下或者ACTION_SENDTO行為下都可以處理文本和圖像。在這種情況下,你必須定義兩個(gè)單獨(dú)的意圖過濾器,因?yàn)锳CTION_SENDTO意圖必須使用數(shù)據(jù)Uri指定接收地址通過使用send或sendto URI計(jì)劃:
<activity android:name="ShareActivity"><!-- filter for sending text; accepts SENDTO action with sms URI schemes --><intent-filter><action android:name="android.intent.action.SENDTO"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="sms" /><data android:scheme="smsto" /></intent-filter><!-- filter for sending text or images; accepts SEND action and text or image data --><intent-filter><action android:name="android.intent.action.SEND"/><category android:name="android.intent.category.DEFAULT"/><data android:mimeType="image/*"/><data android:mimeType="text/plain"/></intent-filter> </activity>Note:為了可以接收隱式意圖,你必須在過濾器中包含類別CATEGORY_DEFAULT。startActivity()和startActivityForResult()方法會(huì)對(duì)待所有的Intent,仿佛他們都聲明了CATEGORY_DEFAULT類別。如果你沒有在意圖過濾器中聲明它,那么將不會(huì)有隱式意圖傳送到該activity中。
有關(guān)更多關(guān)于發(fā)送和接收ACTION_SEND意圖來執(zhí)行社會(huì)分享行為的相關(guān)信息,請(qǐng)參見課程: Receiving Simple Data from Other Apps.
在Activity中處理意圖
為了決定要在activity中采取什么行為,你可以從啟動(dòng)activity的Intent中讀取信息。
隨著activity被啟動(dòng),你可以調(diào)用getIntent()方法獲得啟動(dòng)該Activity的Intent。你可以在activity的任意生命周期內(nèi)做這樣的事情,但是你通常應(yīng)該在較早的回調(diào)方法中做這些事情,比如onCreate()或onStart()。
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// Get the intent that started this activityIntent intent = getIntent();Uri data = intent.getData();// Figure out what to do based on the intent typeif (intent.getType().indexOf("image/") != -1) {// Handle intents with image data ...} else if (intent.getType().equals("text/plain")) {// Handle intents with text ...} }返回結(jié)果
如果需要將結(jié)果返回給調(diào)用該activity的那個(gè)activity,那么只需要簡(jiǎn)單的調(diào)用setResult()方法然后設(shè)置一個(gè)結(jié)果碼以及結(jié)果Intent。當(dāng)你的操作完成并且用戶應(yīng)該返回原來的那個(gè)activity是,調(diào)用finish()方法來關(guān)閉你的activity,像下面這樣:
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"); setResult(Activity.RESULT_OK, result); finish();你需要每一次都給結(jié)果指定一個(gè)結(jié)果碼。通常情況下,要不然是RESULT_OK或者是RESULT_CANCELED。必要的話,可以在Intent中提供附加數(shù)據(jù)。
Note:默認(rèn)情況下,結(jié)果會(huì)設(shè)置RESULT_CANCELED。所以,如果用戶在完成功能之前或者在你設(shè)置結(jié)果之前按下了返回按鈕,那么原來的activity會(huì)接收到”canceled”結(jié)果。
如果你簡(jiǎn)單的需要返回一個(gè)整型,這個(gè)整型指明了若干個(gè)結(jié)果選項(xiàng),那么你可以設(shè)置結(jié)果碼為比0大的任何值。如果你使用了結(jié)果碼來傳遞一個(gè)整型值,那么你不再需要包含Intent對(duì)象,你可以調(diào)用setResult()方法,然后只傳一個(gè)結(jié)果碼進(jìn)去:
setResult(RESULT_COLOR_RED); finish();在這個(gè)例子中,這可能對(duì)結(jié)果有損傷,所以結(jié)果碼是一個(gè)本地變量。這種情況在你自己的APP中運(yùn)行的話,效果會(huì)很好,因?yàn)樵瓉淼腶ctivity可以接收到結(jié)果碼,然后引用一個(gè)公開的常量來判斷結(jié)果碼的值。
Note:這里不需要檢查你的activity是否是通過startActivity()或者startActivityForResult()啟動(dòng)的。那個(gè)啟動(dòng)你activity的activity可能希望會(huì)有個(gè)結(jié)果返回。如果原來的activity調(diào)用了startActivityForResult(),那么系統(tǒng)會(huì)傳遞setResult()結(jié)果,否則,這個(gè)結(jié)果會(huì)被忽略。
總結(jié)
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:与其它APP交互之允许其它APP启动你的Activity的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数码摄影(扫街)
- 下一篇: Android官方开发文档Trainin