如何确保在bindService

时间:2015-07-23 17:33:54

标签: java android android-service

我有一个应用程序,其中活动(MainActivity.java)创建了一个Java类(Algo.java)的对象,该类应该执行一些DataBase条目,然后这个类必须与服务(ActionService.java)传递对象。

为此,在Algo的构造函数中,我调用context.bindService(),但是服务的onBind不会立即调用,但是bindService()返回true,Algo执行它的数据库条目当它的工作完成并准备调用服务方法时,它仍然将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类的整个代码here

2 个答案:

答案 0 :(得分:2)

您应该在活动的onStart()方法中绑定您的服务,并在onStop()中取消绑定。 您可以使用serviceBound(boolean)这样的标记,您可以在onServiceConnectedonServiceDisconnected回调方法中设置为true或false。

修改

您不应该将您的服务绑定到广播接收器, 请查看链接thisthis

您应该将startService方法的意图传递给BroadcastReceiver,并从服务的onStartCommand方法执行任务。

答案 1 :(得分:1)

几个选项,

  1. Algo中,添加一个回调,例如onReady(),

    protected abstract void onReady();

  2. 绑定到服务时调用此方法。在任何使用Algo中,实现该方法,并且在获得onReady()回调之前不要回调Algo来启动任何数据库操作。

    1. Algo之外绑定,无论是托管该类的任何内容(ActivityService还是Application)。绑定后,将服务绑定器传递给Algo的构造函数,以便它可以立即使用它。