从服务启动活动并等待结果

5
我面临以下问题:我需要从服务启动活动。非常重要的是,服务在继续下一个方法之前等待来自活动的结果。
目前我的代码如下:
startActivity(new Intent(this, GoogleAuthHelperActivity.class), FLAG_ACTIVITY_NEW_TASK);
//code should wait for the result of the GoogleAuthHelperActivity before continuing
GoogleAuthHelperActivity.apiClient.isConnected();//gives nullpointer

我在使用Dropbox API进行认证时遇到了同样的问题,因此我需要一个通用的解决方案。

有什么想法来解决这个问题吗?

2个回答

2

在Service中没有类似于startActivityForResult的等效方法,因此您需要自己实现。

第一种选择:

您可以使用几个标准的Java工具来实现,例如Object.wait/Object.notify,这需要共享对象引用。

例如,在某处声明:

public static final Object sharedLock = new Object();

并在您的服务中执行以下操作:

startActivity(new Intent(this, GoogleAuthHelperActivity.class), FLAG_ACTIVITY_NEW_TASK);
synchronized (sharedLock) {
    sharedLock.wait();
}

在活动中:
// do something upon request and when finished:
synchronized (sharedLock) {
    sharedLock.notify();
}

java.util.concurrent 包中还有其他更复杂的类可供使用。但是要小心,服务在与活动相同的线程上运行,因此如果您没有从服务启动新线程,则无法正常工作
另一个可能的问题是,如果您无法在两者之间共享对象引用(因为它们在不同的进程中运行),则必须以其他方式发出完成信号。 第二个选项: 您可以将服务代码分为两部分(活动之前和之后)。运行活动并在完成后向服务发送新意图。收到第二个服务后,您将继续进行第二部分。

我已经实现了你的第一个选项,因为这需要最少的重构。 - user2810895
对于第二个选项,如果服务的第一部分还没有完成,而您调用了第二部分,会发生什么? - Saurabh
@user2923505 这就是为什么你要使用同步原语:确保只有在你等待的部分完成后才继续执行。如果你的情况与 OP 不同,我建议你检查是否已经有人提出了这个问题,如果没有,请创建一个新的问题。 - Sebastian

0

这可以通过创建一个接口并从该接口实现您的活动来实现,我正在发布一个小演示,将帮助您...

public interface MyCallBackNotifier {
    public void notify();
}

在您启动服务的主类中,像这样扩展接口...

public class MainActivity extends Activity implements MyCallBackNotifier {

    private YourService service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        service = new YourService(this);
        service.start();      // Ant method that you call like start();
    }


    @Override
    public void notify() {
             //this is the place where you have to start other activity or do any other process
    }
}

在你的服务类中,你需要做类似这样的事情...

public class YourService {

    private MyCallBackNotifier myCallBackNotifier;

    public YourService(MyCallBackNotifier myCallBackNotifier) {
         this.myCallBackNotifier = MyCallBackNotifier;
    }


    public void start() {

         // Do what so ever you want to do and its will be better to use Asynctask to do background task

         myCallBackNotifier.notify();       // This will call that function in your MainActivty you can pass parameters as well if you want se send some data back to MainActivity

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接