2013-07-23 58 views
0

每个示例都有Service onStart(),并在一段时间内从Service调用方法(如onClick之后)。直到那个onClick服务被绑定。Android的Java - 如何使活动等待,直到服务绑定?

我得到的问题,服务需要一段时间,直到它被绑定,它异步绑定。 因此,如果我启动并且需要立即从服务获取一些数据的活动 - 它会崩溃,因为它尚未绑定。所以我需要等待我的活动​​等待连接完成。我怎么做?

回答

-2

我想你想要的是:http://developer.android.com/guide/components/bound-services.html

在此页面,您可以找到:

/** 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; 
    } 
}; 

onServiceConnected方法被调用时,该服务已准备就绪,你可以做你的东西里(或使用mBound属性)。

要绑定到你的服务,使用:

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

是的,我知道。但是如果你试图做一些像localService.myMethod(); - 你的活动会崩溃,因为绑定不会立即发生,如果你问mBound是真还是假 - 肯定会是错误的。我需要的是某种监听器,当mBound将成为true时,活动可以继续 – user2234594

+0

然后,您可以将代码直接放在'onServiceConnected'中。那有什么问题? – Brtle

+0

太棒了!现在这就是我正在寻找的答案!)我只是移动所有活动 – user2234594

0

您可以利用一个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(); 
}