Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确保在bindService之后调用onBind_Java_Android_Android Service - Fatal编程技术网

Java 如何确保在bindService之后调用onBind

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(在方法

我有一个应用程序,其中activity(
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操作。