远程服务拒绝权限 onBind
Posted
技术标签:
【中文标题】远程服务拒绝权限 onBind【英文标题】:Remote Service deny permission onBind 【发布时间】: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会相信应用程序绑定到服务并将其保存在内存中 - 我只对所使用的上下文进行了弱引用 - 我需要了解该上下文是否仍然与服务相关联。我会调查的。这部分我可能想多了。
【参考方案1】:
您可能必须创建一个解决方法。我在这里看到两个选项:
如果请求被拒绝,则返回没有任何功能的Binder
。然后,客户端必须检查所需的功能是否存在。
总是返回相同的Binder
,但如果不允许调用,则让每个方法抛出一个Exception
(例如SecurityException
)。 (@CommonsWare 在 cmets 中也提出了这一建议)
我个人更喜欢第二种方法,因为它更灵活。 (例如,允许 per-call 允许/拒绝,解决重新绑定后拒绝内容的问题等)
【讨论】:
感谢您的回答-您能否在代码中引用bindService does not create the Service syncronously
?对于Are you sure your onServiceConnected isn't called?
100% 这不是发生在你身上吗?我会更正问题中的措辞,我认为invoked
会是比instantiated
更好的术语?
最简单的展示方式是查看 onBind 调用的来源:它来自 Handler。您可能知道处理程序主要用于异步(进程间)通信。 grepcode.com/file/repository.grepcode.com/java/ext/…
你答案的第一段是完全错误的。如果您添加简单的断点,您将看到bindService
正在等待onBind
的响应,并且在此之前onStartCommand
被调用,无论服务是否正在运行。我不确定您在评论中的意思 - 系统将使用 IPC 来传达 onBind
的响应?
断点不是确定不同线程中调用顺序的可靠方法,因为线程可以并行执行(使用多核和虚拟并行化)。但这无论如何都不会影响结果。无论您将其称为预期行为还是解决方法都不会改变您的代码。
暂停相关话题。我认为你没有测试过你的答案。以上是关于远程服务拒绝权限 onBind的主要内容,如果未能解决你的问题,请参考以下文章