从服务开始活动并等待结果

use*_*895 5 android dropbox-api google-drive-api

我面临以下问题:我需要从服务开始一项活动。服务继续下一个方法之前等待活动的结果非常重要。

目前我有这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

我在对 Dropbox API 进行身份验证时遇到了同样的问题,所以我需要一个通用的解决方案。

任何想法如何解决这个问题?

Seb*_*ian 2

服务中没有等同的东西startActivityForResult,所以你必须自己推出。

第一个选项:

为此,您可以使用多个标准 Java 工具,例如Object.wait / Object.notify,它们需要共享对象引用。

例如,在某处声明:

public static final Object sharedLock = new Object();
Run Code Online (Sandbox Code Playgroud)

并为您服务:

startActivity(new Intent(this, GoogleAuthHelperActivity.class), FLAG_ACTIVITY_NEW_TASK);
synchronized (sharedLock) {
    sharedLock.wait();
}
Run Code Online (Sandbox Code Playgroud)

并在活动中:

// do something upon request and when finished:
synchronized (sharedLock) {
    sharedLock.notify();
}
Run Code Online (Sandbox Code Playgroud)

java.util.concurrent包中还有其他更复杂的类可以用于此目的。但请注意,服务与活动在同一线程上运行,因此如果您不从服务启动新线程,那么这将不起作用

另一个可能的问题是,如果您无法在两者之间共享对象引用(因为它们在不同的进程中运行)。然后你必须以其他方式发出结束信号。

第二个选项:

您可以将服务代码分为两部分(活动之前和之后)。运行活动并在完成后向服务发送新意图。收到第二项服务后,您可以继续第二部分。