2011-06-14 117 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