远程服务拒绝权限 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的主要内容,如果未能解决你的问题,请参考以下文章

ssh服务器拒绝远程连接

远程 Mysql 服务器上的 Laravel 权限被拒绝(AWS aurora)

远程桌面连接被拒绝,因为没有授权

远程连接 拒绝访问

邮件访问被拒绝因为没有授权此用户远程登录什么意思

onBind 和服务连接?