注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/basics/intents/result.html
啟動另一個activity不一定是單向的。你也可以啟動另一個Activity后,接收它返回的結果。為了接收結果,調用
startActivityForResult()
(而不是
startActivity()
)。
例如,你的應用可以啟動一個相機App,并且接受拍攝的照片作為結果。或者,你可以啟動一個“聯系人”App來讓用戶選擇一個聯系方式,而你將這些聯系人的詳細信息作為結果接收。
當然,這個響應intent的Activity必須是設計成可以返回一個結果的。當它確實可以時,它會以另一個
Intent
對象的形式將結果發送回來。你的Activity在
onActivityResult()
回調函數中接收它。
Note:
當你調用 startActivityForResult() 時,你可以使用顯式地或者隱式的intent。當啟動你的一個Activity來接收這個結果時,你應該使用顯式地intent來保證你接收了期望的結果。
?
一). 啟動Activity
當你希望啟動一個返回結果的Activity時,你使用的 Intent 對象并沒有什么別的特別的地方,但你需要給 startActivityForResult() 方法傳遞一個額外的整形參數。
整形參數是一個“
需求碼(request code)
”,用它來標示你的需求。當你接收到裝有結果的
Intent
時,這個回調函數會提供相同的需求碼,這樣你的應用就可以正確地識別結果來自于哪個需求,進而正確地處理結果。
下面的例子展示的是如何啟動一個Activity,允許用戶選擇一個聯系人:
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); }
?
?二). 接收結果
當用戶在處理Intent的Activity中將事務處理完畢并且返回后,系統將會調用你的Activity的 onActivityResult() 方法。這個方法包含了三個參數:
- 你傳遞給 startActivityForResult() 的需求碼。
- 第二個Activity處理后的結果碼。如果成功那就是 RESULT_OK ,如果用戶取消了或因為某個原因操作失敗了,那就是 RESULT_CANCELED 。
- 搭載了結果數據的 Intent 。
下面的例子展示的是如何處理選擇一個聯系人處理完畢后返回的結果:
@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聯系人應用所返回的結果 Intent 提供了一個內容 Uri ,它標識出用戶所選擇的聯系人信息。
為了成功處理這個結果,你必須結果
Intent
中數據的格式是怎么樣的。當返回的結果來自于你自己的Acitivity時,處理起來是簡單的。而Android內置的應用提供了它們自己的APIs,你可以利用它們獲得指定的結果數據。例如,聯系人應用返回的一般是標識了選中的聯系人信息的內容URI,而相機應用返回的是存儲于“
data
”中的一個
Bitmap
。(更多信息可以閱讀:
Capturing Photos
)
?
三). 例子:閱讀聯系人數據
上面的例子展現了如何從聯系人應用獲得一個處理結果,但是如何進一步地去處理返回的結果沒有繼續討論,因為這一方面的知識需要進一步的研究關于 content providers 方面的知識。然而,如果你對此感到好奇,下面的例子展示的是如何查詢結果數據,進而從選擇的聯系人信息中得到電話號碼:
@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 上執行查詢(像上面所展現的)需要你的應用申明 READ_CONTACTS 的授權許可(參考: Security and Permissions )。然而,從 Android 2.3 開始,聯系人應用會授權給你一個臨時的權限,當聯系人應用向你返回一個結果時,允許你從 Contacts Provider 中讀取信息。但是這個臨時權限值僅應用于需要被查詢的那個聯系人信息,所以你通過 intent 的 Uri 查詢不到其它聯系人信息,除非你申明了 READ_CONTACTS 的授權許可。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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