注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術(shù)一般,由于喜愛安卓而產(chǎn)生了翻譯的念頭,純屬個(gè)人興趣愛好。
原文鏈接: http://developer.android.com/training/basics/intents/filters.html
之前的兩節(jié)課關(guān)注于故事的一面:從你的應(yīng)用啟動(dòng)另一個(gè)應(yīng)用的activity。但是如果你的應(yīng)用可以執(zhí)行一個(gè)對(duì)另一個(gè)應(yīng)用來說有用的行為,那么你的應(yīng)用就應(yīng)該準(zhǔn)備好響應(yīng)由其他應(yīng)用所發(fā)起的行為需求。例如,你構(gòu)建了一個(gè)社交應(yīng)用,它可以和用戶的朋友分享信息和照片,那么此時(shí)你最感興趣的就是支持 ACTION_SEND 的Intent,這樣用戶可以在其他應(yīng)用初始化一個(gè)“ 分享 ”的行為,然后啟動(dòng)你的應(yīng)用來執(zhí)行這個(gè)行為。
為了允許其他應(yīng)用啟動(dòng)你的Activity,你需要在清單文件中,在對(duì)應(yīng)的
<activity>
標(biāo)簽內(nèi),
添加一個(gè)
<intent-filter>
(姑且稱之為Intent過濾器)
標(biāo)簽。
當(dāng)你的應(yīng)用安裝在一個(gè)設(shè)備上時(shí),系統(tǒng)會(huì)識(shí)別你的intent過濾器,并且將信息添加至一個(gè)內(nèi)部的目錄,這里面收錄了所有安裝的應(yīng)用所支持的intents。當(dāng)一個(gè)應(yīng)用調(diào)用 startActivity() 或者 startActivityForResult() ,并且使用的是隱式的intent時(shí),系統(tǒng)會(huì)找到哪一個(gè)(些)activity可以相應(yīng)這個(gè)intent。
?
一). 添加一個(gè)Intent過濾器
為了恰當(dāng)?shù)囟x你的activity可以處理什么intents,每個(gè)你添加的intent過濾器,就activity能接受的行為和數(shù)據(jù)類型而言,應(yīng)該是越明確越好。
如果Activity的intent過濾器能夠符合下面列舉的 Intent 對(duì)象標(biāo)準(zhǔn),那么系統(tǒng)會(huì)將該 Intent 交付給這個(gè)activity:
Action
一個(gè)字符串,表征了將要執(zhí)行的行為的名稱。通常是一個(gè)系統(tǒng)所定義的值,如: ACTION_SEND 或者 ACTION_VIEW 。
在你的intent過濾器中,用
<action>
標(biāo)簽來特指接收的行為。在這個(gè)標(biāo)簽中你所特指的值必須是這個(gè)行為的全名,而不是
API
常量(見下面的例子)。
Data
這是一個(gè)和intent所關(guān)聯(lián)的數(shù)據(jù)的描述。
在你的intent過濾器中,用
<data>
標(biāo)簽來特指它。你可以在這個(gè)標(biāo)簽中使用一個(gè)或多個(gè)字段,你可以只定義MIME類型,只定義一個(gè)URI前綴,只定義一個(gè)URI方案,或者是這些和其他類型的結(jié)合,它們指出了能接收的數(shù)據(jù)類型。
Note:
如果你不需要申明關(guān)于數(shù)據(jù) Uri 細(xì)節(jié)(比如當(dāng)你的activity處理其他類型的“extra”數(shù)據(jù),而不是一個(gè)URI),那么你應(yīng)該只指明“ android:mimeType ”這一屬性字段,以此來聲明你的activity要處理的數(shù)據(jù)類型,比如:“ text/plain ”或者“ image/jpeg ”。
Category
提供一個(gè)額外的方法來特定處理該intent的Activity,通常與用戶的手勢(shì)或者它所啟動(dòng)的地點(diǎn)相關(guān)。系統(tǒng)支持一些不同類型的category,但大多數(shù)很少使用。然而,要記住的是所有隱式的intent,默認(rèn)定義了 CATEGORY_DEFAULT 。
在你的Intent過濾器中,用
<category>
標(biāo)簽特指它。
?
在你的intent過濾器中,你可以通過在
<intent-filter>
標(biāo)簽中添加合適的XML標(biāo)簽,來申明你的
activity
接收什么樣的
intent
。
下面的例子是一個(gè)具有intent過濾器的activity,它處理的intent是這樣的,具有 ACTION_SEND 的行為,且數(shù)據(jù)類型是文本或圖像:
< 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只特定一個(gè)行為和一個(gè)數(shù)據(jù)類型,但是在每個(gè)
<intent-filter>
標(biāo)簽中聲明多個(gè)
<action>
,
<data>
或者
<category>
標(biāo)簽的實(shí)例也是可以的。
如果有兩對(duì)行為和數(shù)據(jù),其行為是相互排斥的,你應(yīng)該分別創(chuàng)建intent過濾器,將行為和數(shù)據(jù)類型合理搭配避免沖突。
例如,假設(shè)你的應(yīng)用處理文本和圖像的數(shù)據(jù)類型,也同時(shí)相應(yīng) ACTION_SEND 和 ACTION_SENDTO 的行為。在這種情況下,你必須為兩個(gè)行為分別定義兩個(gè)intent過濾器,因?yàn)橐粋€(gè)含有 ACTION_SENDTO 的intent必須使用數(shù)據(jù) Uri ,并通過使用“ send ”或者“ sendto ”的URI方案,來指定受眾地址。
< 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:
為了接收隱式的intent,你必須在intent過濾器中包含 CATEGORY_DEFAULT 這一category。 startActivity() 和 startActivityForResult() 這兩個(gè)方法都將所有的intent處理為包含有 CATEGORY_DEFAULT 的category。如果你不聲明它,你的應(yīng)用不會(huì)收到任何隱式的intent。
更多關(guān)于發(fā)送和接收 ACTION_SEND 的intents的信息,可以閱讀: Receiving Simple Data from Other Apps
?
二). 處理你的Activity中的Intent
為了決定在你的Activity中決定要執(zhí)行什么行為,你可以讀取啟動(dòng)你的Activity的 Intent 。
當(dāng)你的activity啟動(dòng)后,調(diào)用 getIntent() 來獲取啟動(dòng)這個(gè)Activity的 Intent 。你可以在任意一個(gè)Activity的生命周期階段執(zhí)行這件事情,但一般你應(yīng)該在早期生命周期回調(diào)函數(shù)(如: onCreate() 或者 onStart() )中執(zhí)行。
例如:
@Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1 ) { // Handle intents with image data ... } else if (intent.getType().equals("text/plain" )) { // Handle intents with text ... } }
?
三). 返回一個(gè)結(jié)果
如果你希望給激活你的activity返回一個(gè)結(jié)果,調(diào)用 setResult() 來指定結(jié)果碼和結(jié)果Intent。當(dāng)你的操作執(zhí)行完畢,并且用戶要返回到原來的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é)果指定結(jié)果碼。通常,它不是 RESULT_OK 就是 RESULT_CANCELED 。必要時(shí),你可以提供一個(gè)包含有額外數(shù)據(jù)的 Intent 。
Note:
默認(rèn)結(jié)果碼設(shè)置為 RESULT_CANCELED 。所以當(dāng)用戶在執(zhí)行完行為,或在你將結(jié)果數(shù)據(jù)配置完畢之前,按下返回按鈕,原始的activity會(huì)收到“取消”的結(jié)果。
如果你只需要返回一個(gè)整數(shù),它代表了一些結(jié)果項(xiàng)中的一個(gè),那么你可以將結(jié)果碼設(shè)置為任何一個(gè)大于0的數(shù)。如果你使用結(jié)果碼來返回一個(gè)整數(shù),此時(shí)你不需要再傳遞一個(gè)
Intent
。你可以調(diào)用
setResult()
,并且只傳遞一個(gè)結(jié)果碼,例如:
setResult(RESULT_COLOR_RED);
finish();
在這個(gè)例子中,可能僅有少量的一些結(jié)果,所以結(jié)果碼是一個(gè)本地定義的整形(大于0)。這樣做在你給自己的應(yīng)用的某個(gè)activity返回一個(gè)結(jié)果時(shí),是沒有問題的,因?yàn)榻邮者@個(gè)結(jié)果的activity可以引用公有常量來明確結(jié)果碼的值。
Note:
不需要檢查你的activity是被 startActivity() 還是被 startActivityForResult() 所啟動(dòng)的。如果啟動(dòng)你的activity的intent需要返回一個(gè)值,僅需要調(diào)用 setResult() 。如果原始activity調(diào)用的是 startActivityForResult() ,那么系統(tǒng)將會(huì)發(fā)送給它你在 setResult() 中提供的數(shù)據(jù),不然的話,這個(gè)結(jié)果會(huì)被忽略。
【Android Developers Training】 30. 允許其它應(yīng)用啟動(dòng)你的Activity
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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