在Android中使用AIDL:检查活动是否绑定了服务
我在用AIDL。我有一项服务和一项活动。在函数onCreate中,我绑定了服务,并希望更新UI:在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
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);”操作,但效率不高。