我遇到以下问题:我需要从服务启动活动。服务等待活动>继续下一个方法后的结果非常重要。
目前我有这样的事情:
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的身份验证存在同样的问题,因此我需要一个通用解决方案。
任何想法如何解决这个问题?
答案 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
}
}