【发布时间】:2016-07-08 06:13:46
【问题描述】:
我有一个远程服务,外部应用程序可以绑定到该服务。在某些情况下,我可能希望拒绝绑定。 According to the documentation,
将通信通道返回给服务。可能返回 null 如果 客户端无法绑定到服务。
@Override
public IBinder onBind(final Intent intent) {
return null;
}
返回 null 确实不会返回 IBinder 对象,因此会阻止连接,但是调用应用程序没有正确接收此“信息”。
boolean bound = context.bindService(intent, serviceConnection, flagsHere);
无论是否从Service返回null,this总是返回true?
According to the documentation,
返回 - 如果您已成功绑定到服务,则为 true 回来;如果未建立连接,则返回 false,因此您将 没有收到服务对象
我曾假设从 onBind 返回 null 会导致 bindService 返回 false。假设从来都不是一个好主意...
然而,返回 null 确实会阻止 ServiceConnection 被 instantiated 调用,但这样做的结果是无法检查在 onServiceConnected 中的 binder 实际上是否为 null。
那么,我的问题 - 应用程序如何“知道”绑定请求是否已被拒绝?
此外,如果我即时决定拒绝对onRebind 的请求(之前从onUnbind 返回true),我似乎无法覆盖该行为以防止这种情况发生:
@Override
public void onRebind(final Intent intent) {
if (shouldAllowRebind(intent)) {
super.onRebind(intent);
} else {
// ?
}
}
我希望有人可以为我提供一些启示。提前致谢。
【问题讨论】:
-
bindService()的返回值一直是个问题。 “应用程序如何‘知道’绑定请求是否被拒绝?” -- 大概,它的ServiceConnection永远不会被onServiceConnected()调用。 -
谢谢@CommonsWare 我希望你能发现这个问题!由于
bindService()已返回true,因此应用程序处于“边缘”状态,期待ServiceConnection调用onServiceConnected()因为它没有(由于行为不端),您是否建议一个等待几秒钟的监视器线程并然后检查boolean标识符是否已表明该方法已被调用?否则,将使用的上下文标记为 null 并希望 GC 将其整理?我担心 Android 会认为应用程序绑定到服务并将其保存在内存中 -
"您是否建议一个监视线程等待几秒钟,然后检查布尔标识符是否表明该方法已被调用?" - 就个人而言,我希望以其他方式解决整体问题(例如,拒绝对绑定器的单个 API 调用),而不是尝试拒绝绑定。鉴于此实现,使用某些东西来实现超时(例如,
postDelayed()在View上)可能是您的最佳选择。 “要不然,把使用的上下文标记为null,希望GC整理一下?” -- 抱歉,这部分我没看懂。 -
@CommonsWare 谢谢。在所有情况下都无法在绑定请求之前拒绝,我不会详细说明原因。我担心Android会相信应用程序绑定到服务并将其保存在内存中 - 我只对所使用的上下文进行了弱引用 - 我需要了解该上下文是否仍然与服务相关联。我会调查的。这部分我可能想多了。
标签: java android android-service android-binder