Android java-如何让活动等待服务绑定?

Android java-如何让活动等待服务绑定?,java,android,service,binding,Java,Android,Service,Binding,每个示例都有服务bind onStart()和在一段时间内从服务调用方法(如onClick之后)。直到onClick服务被确定绑定为止 我遇到的问题是,服务需要一段时间才能绑定并异步绑定。 所以,如果我启动了一个需要立即从服务中获取数据的活动,它就会崩溃,因为它还没有绑定。因此,我需要等待连接完成后再进行活动。我该怎么做?我想你想要的是: 在此页面上,您可以找到: /** Defines callbacks for service binding, passed to bindService()

每个示例都有服务bind onStart()和在一段时间内从服务调用方法(如onClick之后)。直到onClick服务被确定绑定为止

我遇到的问题是,服务需要一段时间才能绑定并异步绑定。 所以,如果我启动了一个需要立即从服务中获取数据的活动,它就会崩溃,因为它还没有绑定。因此,我需要等待连接完成后再进行活动。我该怎么做?

我想你想要的是:

在此页面上,您可以找到:

/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }
};
当服务准备就绪并且您可以在内部执行操作(或使用mBound属性)时,将调用
onServiceConnected
方法

要绑定到您的服务,请使用:

    // Bind to LocalService
    Intent intent = new Intent(this, LocalService.class);
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

您可以利用pendingList变量来处理这种情况:

private ICoreService mService;
private boolean mConnected = false;
private boolean mConnecting = false;
private List<Something> mPendingTasks = new ArrayList<Something>;

private void bindService() {     
        try {
            Intent service = new Intent();
            service.setClassName(Constants.THE_SERVICE_PACKAGE_NAME, Constants.THE_SERVICE_FULL_NAME);
            mContext.bindService(service, mServiceConnection, Context.BIND_AUTO_CREATE);
            mConnecting = true;
        } catch (Exception e) {
              //handle exception
        }        
}

public void serviceDoSomething(Something task) {
    try {
        if (mService == null) {
            synchronized (mPendingTasks) {
                mPendingTasks.add(task);
            }
        } else {
            mService.doSomething(task);
        }
    } catch (Exception e) {
       //handle exception
    }
}

private ServiceConnection mServiceConnection = new ServiceConnection() {

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mConnected = false;
        mConnecting = false;
        mService = null;
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mConnected = true;
        mConnecting = false;
        mService = ICoreService.Stub.asInterface(service);
        drainPendingTasks();
    }
};

private void drainPendingTasks() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (mPendingTasks) {
                try {
                    if (!mPendingTasks.isEmpty()) {
                        for (Something task : mPendingTasks) {
                            mService.doSomething(task);
                        }
                        mPendingTasks.clear();
                    }
                } catch (Exception e) {
                    //handle exception
                }
            }
        }
    }).start();
}
private-icoservice-mService;
私有布尔值mConnected=false;
私有布尔mConnecting=false;
私有列表mPendingTasks=newarraylist;
私有void bindService(){
试一试{
意向服务=新意向();
service.setClassName(常量、服务包名、常量、服务全名);
bindService(service,mServiceConnection,Context.BIND\u AUTO\u CREATE);
mConnecting=true;
}捕获(例外e){
//处理异常
}        
}
public void serviceDoSomething(某物任务){
试一试{
if(mService==null){
已同步(mPendingTasks){
mPendingTasks.add(任务);
}
}否则{
mService.doSomething(任务);
}
}捕获(例外e){
//处理异常
}
}
专用ServiceConnection mServiceConnection=新ServiceConnection(){
@凌驾
ServiceDisconnected上的公共无效(组件名称){
mConnected=false;
mConnecting=false;
mService=null;
}
@凌驾
服务连接上的公共无效(组件名称,IBinder服务){
mConnected=true;
mConnecting=false;
mService=ICoreService.Stub.asInterface(服务);
drainPendingTasks();
}
};
专用void drainPendingTasks(){
新线程(newrunnable()){
@凌驾
公开募捐{
已同步(mPendingTasks){
试一试{
如果(!mPendingTasks.isEmpty()){
用于(任务:mPendingTasks){
mService.doSomething(任务);
}
mPendingTasks.clear();
}
}捕获(例外e){
//处理异常
}
}
}
}).start();
}

是的,我知道。但是如果您尝试执行类似localService.myMethod()的操作您的活动将崩溃,因为绑定不会立即生效,如果您询问mBound是真是假,那么肯定是假。当mBound为真时,我需要某种类型的监听器,这样活动就可以继续进行。然后,您可以将代码直接放在服务连接的
中。有什么问题吗?太好了!这就是我一直在寻找的答案!)我只是把所有的活动都搬到了那个里,我接受了,但答案并不是关于我的问题。我的问题是如何让活动等待绑定