在Android中使用AIDL:检查活动是否已绑定服务

时间:2013-01-10 16:54:10

标签: android service bind aidl

我正在使用AIDL。我有服务和活动。在onCreate函数中我绑定了服务,我想更新UI:

private ServiceConnection conn = null;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    bindService();
    String name = conn.s.getName();

}
public class ServiceConnection implements ServiceConnection {
public IService s = null;

public void onServiceConnected(ComponentName className, IBinder boundService) {
    s = IService.Stub.asInterface((IBinder) boundService);
    Log.d(getClass().getSimpleName(), "onServiceConnected()");
}

public void onServiceDisconnected(ComponentName className) {
    s = null;
    Log.d(getClass().getSimpleName(), "onServiceDisconnected");
}
}

所以我得到一个nullpointer因为服务还没有绑定。我如何检查活动是否已绑定服务?

我真正需要的是简单:创建活动 - >使用AIDL从服务获取信息 - >更新UI。如果我把一个按钮“更新”所有工作正常但我不知道如何自动执行此操作。有些想法? 我可以用:

做一个帖子
while(conn.s==null)
  ;
updateUI();

但我认为它不优雅或高效。

2 个答案:

答案 0 :(得分:0)

要测试您的服务是否已连接,请将此方法添加到ServiceConnection类中:

public boolean isConnected() {
   return s == null;
}

另一个解决方案:在类中添加一个布尔值,并在connect / disconnect上设置为true / false。

重新使用API​​类的名称通常是一个非常糟糕的主意,因为在阅读所有导入之前,更难理解使用哪些实现。

答案 1 :(得分:0)

在onCreate中,您不应该执行在绑定服务之前无法执行的操作。您需要推迟这些操作并等待onServiceConnected被调用。

是不是onServiceConnected你正在寻找的“onConnectionEstablished回调”?在与服务建立连接时调用onServiceConnected