从服务启动 activity 并等待结果

Starting an activity from a service and wait for the result

我面临以下问题:我需要从服务启动 activity。在 继续下一个方法之前,服务等待 activity 的结果非常重要。

目前我有这样的东西:

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 进行身份验证时遇到了同样的问题,因此我需要一个通用的解决方案。

有什么解决办法吗?

这可以通过创建一个界面并从该界面实现您的 activity 来实现,我正在发布一个小演示,它将帮助您...

public interface MyCallBackNotifier {
    public void notify();
}

从您开始服务的主要 class 扩展该界面 ...

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
    }
}

在你的服务中class你必须做这样的事情......

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

    }

}

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();
}

并在 activity 中:

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

java.util.concurrent 包中还有其他更复杂的 类 可以用于此目的。不过要小心,服务 运行 与 Activity 在同一个线程上,所以 如果你没有从服务启动一个新线程,那么这将不起作用 .

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

第二个选项:

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