Java 如何确保在bindService之后调用onBind
我有一个应用程序,其中activity(Java 如何确保在bindService之后调用onBind,java,android,android-service,Java,Android,Android Service,我有一个应用程序,其中activity(MainActivity.java)创建了一个java类(Algo.java)的对象,该类应该执行一些数据库条目,然后该类必须与服务(ActionService.java)绑定才能传递一个对象 为此,在Algo的构造函数中,我调用context.bindService(),但不会立即调用服务的onBind,但是bindService()返回true,Algo执行其DB条目,当其工作完成并且准备好调用服务方法时,它仍然将mBound变量设置为null(在方法
MainActivity.java
)创建了一个java类(Algo.java
)的对象,该类应该执行一些数据库条目,然后该类必须与服务(ActionService.java
)绑定才能传递一个对象
为此,在Algo的构造函数中,我调用context.bindService()
,但不会立即调用服务的onBind,但是bindService()
返回true
,Algo执行其DB条目,当其工作完成并且准备好调用服务方法时,它仍然将mBound
变量设置为null(在方法publishToActionService
中),但在此之后它调用了onBound()
方法和随后的onServiceConnected()
,现在我环顾四周,发现它是一个异步调用,但是有没有办法确保在代码中的任何其他执行之前调用onBound
代码说明如下:
public Algo(Context context){
this.context = context;
this.dbh = DBHelper.getInstance(context);
Intent intent = new Intent(context, ActionService.class);
boolean b = context.getApplicationContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
//method to make DB calls
//---
private void publishToActionService(HackBotEvent hackBotEvent){
if((hackBotEvent != null) && (hackBotEvent.getIsLearned() != -1) && (mBound))
{
mService.fillListenedEventList(hackBotEvent);
}
}
private static ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
Log.d(LOG,"in onServiceConnected, setting mBound true");
ActionService.LocalBinder binder = (ActionService.LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
Log.d(LOG,"in onServiceDisconnected, setting mBound false");
mBound = false;
}
};
MainActivity.java,这是Algo调用:
Algo algo = new Algo(this);
可以看到Algo.java类的全部代码。您应该在活动的
onStart()
方法中绑定服务,并在onStop()中解除绑定。
您可以有一个类似于serviceBound(boolean)
的标志,您可以在onServiceConnected
和onservicecdisonnected
回调方法中设置该标志为true或false
编辑
您不应将您的服务与广播接收器绑定,
请查看链接和
您应该从BroadcastReceiver
中传递startService
方法的意图,并从服务的onStartCommand
方法执行任务。您应该在活动的onStart()
方法中绑定服务,并在onStop()
中解除绑定。
您可以有一个类似于serviceBound(boolean)
的标志,您可以在onServiceConnected
和onservicecdisonnected
回调方法中设置该标志为true或false
编辑
您不应将您的服务与广播接收器绑定,
请查看链接和
您应该从BroadcastReceiver
中传递startService
方法的意图,并从服务的onStartCommand
方法执行任务。您应该在活动的onStart()
方法中绑定服务,并在onStop()
中解除绑定。
您可以有一个类似于serviceBound(boolean)
的标志,您可以在onServiceConnected
和onservicecdisonnected
回调方法中设置该标志为true或false
编辑
您不应将您的服务与广播接收器绑定,
请查看链接和
您应该从BroadcastReceiver
中传递startService
方法的意图,并从服务的onStartCommand
方法执行任务。您应该在活动的onStart()
方法中绑定服务,并在onStop()
中解除绑定。
您可以有一个类似于serviceBound(boolean)
的标志,您可以在onServiceConnected
和onservicecdisonnected
回调方法中设置该标志为true或false
编辑
您不应将您的服务与广播接收器绑定,
请查看链接和
您应该从BroadcastReceiver
中传递startService
方法的意图,并从服务的onStartCommand
方法执行任务。两个选项
在Algo
中,添加回调,如onReady()
受保护的抽象void onReady()
当您绑定到服务时,您可以调用它。在任何使用Algo
的情况下,实现该方法,并且在获得onReady()回调之前,不要回调到Algo
以启动任何DB操作
绑定在Algo
之外的任何类中(无论是活动
、服务
、还是应用程序
)。绑定后,将服务绑定器传递到Algo
的构造函数中,以便它可以立即使用它
两种选择
在Algo
中,添加回调,如onReady()
受保护的抽象void onReady()
当您绑定到服务时,您可以调用它。在任何使用Algo
的情况下,实现该方法,并且在获得onReady()回调之前,不要回调到Algo
以启动任何DB操作
绑定在Algo
之外的任何类中(无论是活动
、服务
、还是应用程序
)。绑定后,将服务绑定器传递到Algo
的构造函数中,以便它可以立即使用它
两种选择
在Algo
中,添加回调,如onReady()
受保护的抽象void onReady()
当您绑定到服务时,您可以调用它。在任何使用Algo
的情况下,实现该方法,并且在获得onReady()回调之前,不要回调到Algo
以启动任何DB操作
绑定在Algo
之外的任何类中(无论是活动
、服务
、还是应用程序
)。绑定后,将服务绑定器传递到Algo
的构造函数中,以便它可以立即使用它
两种选择
在Algo
中,添加回调,如onReady()
受保护的抽象void onReady()
当您绑定到服务时,您可以调用它。在任何使用Algo
的情况下,实现该方法,在获得onReady()回调之前,不要回调Algo
以启动任何DB操作。