从服务启动 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 并在完成后向服务发送新意图。收到第二项服务后,您将继续第二部分。
我面临以下问题:我需要从服务启动 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 并在完成后向服务发送新意图。收到第二项服务后,您将继续第二部分。