注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術(shù)一般,由于喜愛安卓而產(chǎn)生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/basics/intents/result.html
啟動另一個activity不一定是單向的。你也可以啟動另一個Activity后,接收它返回的結(jié)果。為了接收結(jié)果,調(diào)用
startActivityForResult()
(而不是
startActivity()
)。
例如,你的應(yīng)用可以啟動一個相機App,并且接受拍攝的照片作為結(jié)果。或者,你可以啟動一個“聯(lián)系人”App來讓用戶選擇一個聯(lián)系方式,而你將這些聯(lián)系人的詳細信息作為結(jié)果接收。
當(dāng)然,這個響應(yīng)intent的Activity必須是設(shè)計成可以返回一個結(jié)果的。當(dāng)它確實可以時,它會以另一個
Intent
對象的形式將結(jié)果發(fā)送回來。你的Activity在
onActivityResult()
回調(diào)函數(shù)中接收它。
Note:
當(dāng)你調(diào)用 startActivityForResult() 時,你可以使用顯式地或者隱式的intent。當(dāng)啟動你的一個Activity來接收這個結(jié)果時,你應(yīng)該使用顯式地intent來保證你接收了期望的結(jié)果。
?
一). 啟動Activity
當(dāng)你希望啟動一個返回結(jié)果的Activity時,你使用的 Intent 對象并沒有什么別的特別的地方,但你需要給 startActivityForResult() 方法傳遞一個額外的整形參數(shù)。
整形參數(shù)是一個“
需求碼(request code)
”,用它來標(biāo)示你的需求。當(dāng)你接收到裝有結(jié)果的
Intent
時,這個回調(diào)函數(shù)會提供相同的需求碼,這樣你的應(yīng)用就可以正確地識別結(jié)果來自于哪個需求,進而正確地處理結(jié)果。
下面的例子展示的是如何啟動一個Activity,允許用戶選擇一個聯(lián)系人:
static final int PICK_CONTACT_REQUEST = 1; // The request code ... private void pickContact() { Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts" )); pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); }
?
?二). 接收結(jié)果
當(dāng)用戶在處理Intent的Activity中將事務(wù)處理完畢并且返回后,系統(tǒng)將會調(diào)用你的Activity的 onActivityResult() 方法。這個方法包含了三個參數(shù):
- 你傳遞給 startActivityForResult() 的需求碼。
- 第二個Activity處理后的結(jié)果碼。如果成功那就是 RESULT_OK ,如果用戶取消了或因為某個原因操作失敗了,那就是 RESULT_CANCELED 。
- 搭載了結(jié)果數(shù)據(jù)的 Intent 。
下面的例子展示的是如何處理選擇一個聯(lián)系人處理完畢后返回的結(jié)果:
@Override protected void onActivityResult( int requestCode, int resultCode, Intent data) { // Check which request we're responding to if (requestCode == PICK_CONTACT_REQUEST) { // Make sure the request was successful if (resultCode == RESULT_OK) { // The user picked a contact. // The Intent's data Uri identifies which contact was selected. // Do something with the contact here (bigger example below) } } }
在這個例子中,由Android聯(lián)系人應(yīng)用所返回的結(jié)果 Intent 提供了一個內(nèi)容 Uri ,它標(biāo)識出用戶所選擇的聯(lián)系人信息。
為了成功處理這個結(jié)果,你必須結(jié)果
Intent
中數(shù)據(jù)的格式是怎么樣的。當(dāng)返回的結(jié)果來自于你自己的Acitivity時,處理起來是簡單的。而Android內(nèi)置的應(yīng)用提供了它們自己的APIs,你可以利用它們獲得指定的結(jié)果數(shù)據(jù)。例如,聯(lián)系人應(yīng)用返回的一般是標(biāo)識了選中的聯(lián)系人信息的內(nèi)容URI,而相機應(yīng)用返回的是存儲于“
data
”中的一個
Bitmap
。(更多信息可以閱讀:
Capturing Photos
)
?
三). 例子:閱讀聯(lián)系人數(shù)據(jù)
上面的例子展現(xiàn)了如何從聯(lián)系人應(yīng)用獲得一個處理結(jié)果,但是如何進一步地去處理返回的結(jié)果沒有繼續(xù)討論,因為這一方面的知識需要進一步的研究關(guān)于 content providers 方面的知識。然而,如果你對此感到好奇,下面的例子展示的是如何查詢結(jié)果數(shù)據(jù),進而從選擇的聯(lián)系人信息中得到電話號碼:
@Override protected void onActivityResult( int requestCode, int resultCode, Intent data) { // Check which request it is that we're responding to if (requestCode == PICK_CONTACT_REQUEST) { // Make sure the request was successful if (resultCode == RESULT_OK) { // Get the URI that points to the selected contact Uri contactUri = data.getData(); // We only need the NUMBER column, because there will be only one row in the result String[] projection = {Phone.NUMBER}; // Perform the query on the contact to get the NUMBER column // We don't need a selection or sort order (there's only one result for the given URI) // CAUTION: The query() method should be called from a separate thread to avoid blocking // your app's UI thread. (For simplicity of the sample, this code doesn't do that.) // Consider using CursorLoader to perform the query. Cursor cursor = getContentResolver() .query(contactUri, projection, null , null , null ); cursor.moveToFirst(); // Retrieve the phone number from the NUMBER column int column = cursor.getColumnIndex(Phone.NUMBER); String number = cursor.getString(column); // Do something with the phone number... } } }
Note:
在Android 2.3(API Level 9)之前,在
Contacts Provider 上執(zhí)行查詢(像上面所展現(xiàn)的)需要你的應(yīng)用申明 READ_CONTACTS 的授權(quán)許可(參考: Security and Permissions )。然而,從 Android 2.3 開始,聯(lián)系人應(yīng)用會授權(quán)給你一個臨時的權(quán)限,當(dāng)聯(lián)系人應(yīng)用向你返回一個結(jié)果時,允許你從 Contacts Provider 中讀取信息。但是這個臨時權(quán)限值僅應(yīng)用于需要被查詢的那個聯(lián)系人信息,所以你通過 intent 的 Uri 查詢不到其它聯(lián)系人信息,除非你申明了 READ_CONTACTS 的授權(quán)許可。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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