2012-08-12 57 views
5

高低搜索對我的問題沒有結果。因此,我終於發帖尋求一些幫助。如何讓外部Activity的startActivityForResult工作?

我有兩個應用程序,都由我寫的。應用程序A啓動應用程序B,通過Intent.putExtra()傳入參數。當App B啓動時參數傳遞的很好,這很好地工作。

但是,我無法找到一種方法來返回應用程序答案。使用startActivityForResult()總是給我立即onResult()與RESULT_CANCELED()。經過進一步檢查,logcat給了我一個警告,說明「活動正在啓動作爲一項新任務,因此取消活動結果」。

我試着用不同的啓動模式,動作過濾器(android.intent.action.PICK)進行應用程序B的活動,但沒有做任何改變。

我想要做不可能的事情嗎?據我所知,我試圖做的應該類似於使用第三方活動從設備的照片庫挑選圖片。

編輯:

好吧,我試着刪除從活動B發射器類別,但它仍然無法正常工作。這是我的活動:

<activity android:name=".${CLASSNAME}" android:label="@string/app_name" android:configChanges="mcc|mnc|locale|keyboardHidden|orientation" android:launchMode="standard"> 
    <intent-filter> 
     <action android:name="android.intent.action.PICK" /> 
    </intent-filter> 
</activity> 

有沒有人真的有這個工作?我開始懷疑,啓動另一個應用程序的活動永遠不會返回結果,因爲無論您將其放在「意圖過濾器」中,它總會啓動一項新任務。

+0

發佈您正在使用的代碼構建並啓動ActivityB的意圖。你應該能夠放置這樣的東西:'this.setResult(Activity.RESULT_OK,data);'在第二個Activity中返回第一個。 – FoamyGuy 2012-08-12 03:47:25

+0

你可以發佈你的清單文件嗎?也許活動B有一些特殊的標籤 – nandeesh 2012-08-12 06:53:22

+0

嗯...活動B有這是否會導致問題?我現在不在我的工作機器上。我會嘗試刪除它,看看是否有效。 事情是從我讀過的,開始一個不屬於同一個軟件包一部分的活動將總是從一個新的任務開始?如果是這種情況,startActivityForResult將無法在另一個apk上啓動外部活動? – 2012-08-12 13:50:05

回答

0

在您的活動B,你應該有這樣的事情,

Intent intent = new Intent(); 
setResult(Activity.RESULT_OK, intent); 
finish(); 

還是可以的,

setResult(Activity.RESULT_OK); 
finish(); 

,你不需要任何數據傳遞給活動A.

否則它將始終以結果代碼Activity.RESULT_CANCELED結束;

如果兒童活動因任何原因(例如崩潰)失敗, 父活動將接收到代碼爲RESULT_CANCELED的結果。

希望這會有所幫助。

+1

我確實實現了。問題是活動A甚至在活動B結束之前調用了onActivityResult()。 Logcat給我「活動正在啓動作爲一個新的任務,所以取消活動的結果」。所以看起來Activity B是作爲一項新任務推出的,這應該不會令人驚訝,因爲它是一個不同的apk應用程序?圖像選擇器等實用程序活動是如何編寫的? – 2012-08-12 13:44:41

+0

@ Lf3T-Hn4D正如你所提到的,你有'launcher'類別,它將開始作爲新任務的活動。因此,它將完全獨立於發起它的活動。刪除該類別樣式並嘗試。 http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK – 2012-08-12 14:15:48

+0

啊..好的。當我回到我的工作機器時,我會試一試並報告。 :-)謝謝 – 2012-08-12 14:19:01

9

確保您正在啓動的活動沒有在清單中對其設置android:launchMode,並檢查android:taskAffinity未被使用。在這裏看到:

http://developer.android.com/guide/topics/manifest/activity-element.html#aff

確保意圖您正在使用啓動活動沒有FLAG_ACTIVITY_NEW_TASK設置就可以了。在這裏看到:

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK

特別指出:「當主叫用戶請求的結果從正在啓動的活動這個標誌不能被使用。「

如果活動作爲新任務的一部分啓動,則Android將立即使用RESULT_CANCELED調用onActivityResult(),因爲一個任務中的活動無法將結果返回給另一個任務,只有同一任務中的活動纔可以這樣做。

+0

很好的幫助,謝謝 – Ninja 2016-03-16 09:08:33

1

有我看了看源代碼相同的問題,爲什麼會被添加NEW_TASK標誌。

原來如果源活性的或目標活動B使用的是單實例啓動模式下,自動添加NEW_TASK標誌:

if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 
     // The original activity who is starting us is running as a single 
     // instance... this new activity it is starting must go on its 
     // own task. 
     launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 
    } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 
      || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 
     // The activity being started is a single instance... it always 
     // gets launched into its own task. 
     launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 
    } 

由於您擁有這兩個應用程序,您應該能夠確保這些啓動模式未在清單或意圖中定義。

到目前爲止,我找不到任何其他不願意設置的NEW_TASK標誌實例。

相關問題