Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.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
在Android中使用AIDL:检查活动是否绑定了服务_Android_Service_Bind_Aidl - Fatal编程技术网

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

在Android中使用AIDL:检查活动是否绑定了服务,android,service,bind,aidl,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

我在用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");
}
}
所以我得到一个空指针,因为服务还没有绑定。如何检查活动是否已绑定服务

实际上我需要的很简单:创建活动->使用AIDL从服务获取信息->更新UI。如果我按下“更新”按钮,一切正常,但我不知道如何自动完成。有什么想法吗? 我可以用以下工具制作一个线程:

while(conn.s==null)
  ;
updateUI();

但我认为它既不优雅也不高效。

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

public boolean isConnected() {
   return s == null;
}
另一种解决方案:在类中添加一个布尔值,并在连接/断开连接时设置为true/false


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

在onCreate中,您不应该做在绑定服务之前无法做的事情。您需要定位这些操作,并等待调用OnServiceConnection


onServiceConnected不是您要查找的“OnConnection已建立回调”吗?当与服务的连接已建立时调用OnServiceConnection

绑定服务是异步的。您只能在通知连接侦听器后使用它,即,在OnConnectionsEstablished或类似的程序中。您拥有在连接服务时调用的OnServiceConnection。从该方法更新UI。为什么不呢?如果您真的需要,可以让onCreate等待服务绑定的通知。但在停止UII时要小心,因为UII找不到类似“OnConnectionsEducted”的东西。我无法从onServiceConnected更新UI,因为连接是异步的。但我需要自动更新UI。我需要一个类似于侦听器的东西,它在活动绑定了服务时运行。我可以在线程中执行:“while(conn.s==null);”操作,但效率不高。