2016-12-25 19 views
1

這個返回結果時設置的行動的目的是從Training for Android developers通過的setResult

//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(); 

示例代碼當我們從子活動返回一個結果,通常我們只需要設置額外的或URI數據。這裏指定一個自定義動作的目的是什麼? 更新:

假設我們要打開圖庫應用程序來選擇要在我們的應用程序中使用的圖像。

調用圖庫應用程序

Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent,PICK_IMAGE_REQUEST); 

返回結果

Intent result = new Intent();    
    result.setData(_Uri.parse("content://result_uri"); 
    setResult(Activity.RESULT_OK, result); 
    finish(); 

處理結果

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Check which request we're responding to 
    if (requestCode == PICK_IMAGE_REQUEST) { 
     // Make sure the request was successful 
     if (resultCode == RESULT_OK) { 
      Uri imageUri = data.getData(); 
      // Do something with the image here 
    } 
} 

我沒有在示例代碼中設置 「com.example.RESULT_ACTION」以上。

回答

3

當您撥打startActivityForResutl表示您期待第二/子活動的響應,並且onActivityResult將在用戶返回到上一活動時觸發。

onActivityResult有3個參數,其中之一是intent如果第二/次活動還沒有叫setResult功能,那麼你將在以前的活動

收到intentnull你的情況result意圖絕不會交付您以前的活動,如果你不叫setResult funtion

第一個活動

Intent intent = new (..., secondActivity); 
.. 
startActivityForResult(intent,1); 

次活動

.... 
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); 

//setResult(Activity.RESULT_OK, result); this is not there 
finish(); 

第一個活動

... OnActivityResult(int response, int request, Intent data) 
       //          ^^^ will be null because 
       // setResult was not called in second activity so to get data intent 
       // you have to call setResult   

注:,如果你不希望有任何結果,那麼使用startActivity代替startActivityForResult會有無需調用setResult在第二個活動和OnActivityResult功能將不會觸發


更新:

Intent result = new Intent("com.example.RESULT_ACTION", 
Uri.parse("content://result_uri")); 

com.example.RESULT_ACTION:意思是執行操作的類型,這是在這種情況下是一個結果的行動

它類似的intent-filter

<activity android:name="ShareActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.SEND"/> 
     ^^^ 
    </intent-filter> 
</activity> 
action

,以便您可以驗證執行的操作類型。克活性導致你可以做

if(data.getAction().equals("com.example.RESULT_ACTION")) 
{ // do this} 
else if(data.getAction().equals("android.intent.action.SEND"") { 
    // do something here} 

明明可以做到使用請求和響應代碼,但是當兩個應用程序,而不是兩個活動

content://result_uri之間的數據或操作發生的位置就是這是非常有用的一個例子再次在文檔,但是這意味着,數據的類型意味着大約有意向

例如相關的數據的詳細信息:如果你想使用意向來打開圖像與安裝在系統上使用

應用發送圖片
intent.setDataAndType(Uri.parse("file://" + "/sdcard/test.jpg"), "image/*"); 

其中image/*描述文件的類型是圖像

例如getData,給你在其意圖正在平均它得到的數據/文件資源可被進一步用於驗證數據的URI類型。

所以這是非常有用的,當通信需要兩個應用程序之間,但同時使用相同的應用程序內startActivityForResult那麼你可以使用請求和響應代碼

+0

我的問題是在這裏指定一個自定義操作的目的,在這種情況下設置「com.example.RESULT_ACTION」。我不明白爲什麼我們需要設置,我認爲這不是必要的。 – user3591494

+0

@ user3591494這是沒有必要的,讓我更新答案 –

+0

非常感謝你,Pavneet。我認爲這已經解決了問題。但是我仍然不完全明白爲什麼它對兩個應用程序有用而不是兩個操作,你能詳細說明還是給我另一個例子? – user3591494

0

希望簡單地識別結果類型的地方,這將幫助你:

http://www.vogella.com/tutorials/AndroidIntent/article.html#retrieving-result-data-from-a-sub-activity

意圖用於向Android系統發送某個事件已發生的信號。意圖通常描述應該執行的動作並提供應該執行這種動作的數據。例如,您的應用程序可以通過意向爲某個URL啓動瀏覽器組件。以下示例說明了這一點。

String url = "http://www.vogella.com"; 
Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(Uri.parse(url)); 
startActivity(i); 

但是,Android系統如何識別可以對特定意圖做出反應的組件?

組件可以通過針對特定操作和特定數據的意圖過濾器註冊自己。意圖過濾器通過聲明組件的功能來指定活動,服務或廣播接收者可以響應的意圖類型。

Android組件在AndroidManifest.xml中靜態註冊意圖過濾器,或者在廣播接收器的情況下也通過代碼動態註冊。意圖過濾器由其類別,操作和數據過濾器定義。它也可以包含額外的元數據。

如果意圖發送到Android系統,則Android平臺運行接收器確定。它使用意圖中包含的數據。如果幾個組件已經註冊了相同的意圖過濾器,用戶可以決定應該啓動哪個組件。

0

每個來電的意圖只規定了一個動作,一個數據類型,但 它的確定申報的<action><category>多個實例,並在每個<intent-filter>.

<data>元素它說,任何活動或您將結果從活動或子活動中發送到您的結果的子活動,則需要爲您發送結果的活動再次定義該動作Intent,由於其<intent-filter>定義了適當的處理方式,因此Intent

所以它更像是一個安全的方法<intent-filter>

相關問題