我有一个远程服务,外部应用程序可以绑定到它上面。在某些情况下,我可能会拒绝绑定请求。根据文档,
返回与服务通信的通道。如果客户端无法绑定到服务,则可以返回null。
@Override
public IBinder onBind(final Intent intent) {
return null;
}
返回 null 的确不会返回一个 IBinder 对象,因此会阻止连接,但是调用应用程序并不能正确地接收到这个“信息”。
boolean bound = context.bindService(intent, serviceConnection, flagsHere);
无论从服务返回 null 还是其他值,该方法始终返回 true 吗?根据文档,
返回值 - 如果你已经成功绑定到服务,则返回 true;如果连接未建立,将返回 false,因此您将无法收到服务对象。
我曾认为从onBind返回 null 会导致 bindService 返回 false。做出假设从来不是一个好主意...
但是,返回 null 确实会阻止ServiceConnection被
因此,我的问题是 - 应用程序如何“知道”绑定请求已被拒绝? 另外,如果我决定即时拒绝对onRebind(之前已从onUnbind返回 true)的请求,则似乎无法覆盖此行为:
@Override
public void onRebind(final Intent intent) {
if (shouldAllowRebind(intent)) {
super.onRebind(intent);
} else {
// ?
}
}
我希望有人能为我解惑。先行致谢。
bindService()
的返回值已经成为一个问题已经有一段时间了。 “应用程序如何‘知道’绑定请求是否被拒绝?”——可能是因为它的ServiceConnection
没有被调用,也就是没有执行onServiceConnected()
方法。 - CommonsWarebindService()
返回了true,应用程序被留在'limbo'状态中,期望ServiceConnection
调用onServiceConnected()
。由于它没有(由于行为不当),您是否建议监视线程等待几秒钟,然后检查一个布尔标识符是否已发出方法调用的信号?否则,将使用的上下文标记为null,并希望GC会将其整理干净?我担心Android会认为应用程序已绑定到服务并将其保留在内存中。 - brandallView
上的postDelayed()
)可能是您最好的选择。否则,将使用的上下文标记为null并希望GC将其清理干净?抱歉,我没有理解这部分内容。 - CommonsWare