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

时间:2015-08-19 09:26:12

标签: android google-drive-api dropbox-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

我对Dropbox API的身份验证存在同样的问题,因此我需要一个通用解决方案。

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

2 个答案:

答案 0 :(得分:2)

在服务中没有等同于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包中还有其他更复杂的类可供您使用。但请注意,服务与活动在同一个线程上运行,所以如果你没有从服务启动一个新的线程,那么这将不起作用

另一个可能的问题是,如果你不能在它们之间共享一个对象引用(因为它们在不同的进程中运行)。然后你必须以其他方式表示完成。

第二个选项:

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

答案 1 :(得分: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

    }

}