2011-06-14 68 views
5

我有一個應用程序,我正在啓動一個新的活動,並且需要在繼續之前獲得活動的結果。同步startActivityForResult - 等待活動完成

我意識到startActivityForResult是異步/非阻塞的,我可以在onActivityResult回調中獲取活動的結果。

所以我想我正在尋找的是等待活動返回的最佳方式... 也許這樣的事情?或者,還有更好的方法?

活動啓動功能:

public String ActivityLauncher() 
{ 
    //Set up Intent 
    startActivityForResult(intent, 1); 
    while (mIsActivityDone == false) 
    { 
     Thread.Sleep(250); 
    } 
    //Continue with processing 
    String data = "<Data from Activity"> 
    return data; 
} 

回調:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    //Pull out the data 
    mIsActivityDone = true; 
} 

的數據需要恢復到一個更高的層次調用函數 - 這就是爲什麼我需要等待結果的ActivityLauncher功能。

謝謝!

回答

7

這將阻止你的UI線程,所以其他活動也不會執行。 我會用某種由更高級別的功能提供回調類,在這種情況下並調用回調函數在onActivityResult

+1

同意,只需將「//處理數據的繼續」移動到'onActivityResult()'方法中。如果你需要這樣做幾次,那也沒關係:這就是爲什麼startActivityForResult()需要一個'int requestCode'參數,它返回到'onActivityResult()',所以你知道哪個請求正在返回。 – Joe 2011-06-15 00:20:27

+0

謝謝,我感謝架構的幫助。 – 2011-06-15 00:51:22

2

如果你可以從一個新的線程啓動這些活動,那麼Android有你的解決方案。您可以使用Instrumentation。爲什麼你需要一個新的線程?因爲startActivitySync會檢查你是否在主線程中被調用。如果它的主線程那麼它會拋出一個異常。

儀器讓你監測一個活動。您可以以阻塞或非阻塞的方式監控此活動。

IntentFilter intF = new IntentFilter("ACTIVITY.THAT.YOU.WANT.TO.LAUNCH"); 

Instrumentation instrumentation = new Instrumentation(); 

Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(intF, null, true); 
Intent i = new Intent("ACTIVITY.THAT.YOU.WANT.TO.LAUNCH"); 
instrumentation.startActivitySync(i); 
+0

感謝您的回覆,我實際上已經完成了我的Android項目,所以我目前無法真正測試這個,但是我很感激! – 2011-12-09 21:05:07

+0

好的建議。只是想添加這個只會在你的活動駐留在同一個進程(應用程序)中時才起作用。該API不適用於各個進程。 – Bamerza 2014-08-19 00:02:46