2016-03-21 73 views
17

我有一个远程服务,可以绑定到哪些外部应用程序。有些情况下,我可能希望拒绝这种约束。 According to the documentation,远程服务拒绝绑定的权限

将通信信道返回给服务。如果 客户端无法绑定到服务,可能会返回null。

@Override 
public IBinder onBind(final Intent intent) { 
    return null; 
} 

返回null确实不返回IBinder对象,从而防止了连接,但是调用应用程序不能正确地接收该“信息”。

boolean bound = context.bindService(intent, serviceConnection, flagsHere); 

无论是否从服务返回null或不是,这总是返回true?

According to the documentation

返回 - 如果您已成功绑定到服务,真正为 返回;如果连接不言,所以你会 没有收到

我曾以为,从onBind返回null会造成bindService返回false服务对象返回false。假设是不是一个好主意......

返回null,但是不会阻止ServiceConnection 实例 调用,但这样做的结果就没有选项来检查粘合剂其实空的onServiceConnected

所以,我的问题 - 如果绑定请求被拒绝,应用程序如何“知道”?

此外,如果我决定,要onRebind请求(之前曾从onUnbind返回TRUE)飞应被拒绝,我似乎无法重写的行为,以防止这种情况:

@Override 
public void onRebind(final Intent intent) { 

    if (shouldAllowRebind(intent)) { 
     super.onRebind(intent); 
    } else { 
     // ? 
    } 
} 

我希望有人能为我揭开一些光。提前致谢。

+4

bindService()的返回值已经存在很长时间了。 “如果绑定请求被拒绝,应用程序如何”知道“?“ - 大概它的'ServiceConnection'永远不会被'onServiceConnected()'调用 – CommonsWare

+0

Thanks @CommonsWare我希望你能发现这个问题!由于'bindService()'返回true,所以应用程序保留在' limbo'期待'ServiceConnection'调用'onServiceConnected()'因为它不会(由于不正常行为),你会建议一个等待几秒钟的监控线程,然后检查一个'boolean'标识符是否表示方法是调用?否则,将上下文标记为null,并希望GC将它整理出来?我担心Android会认为应用程序绑定到服务并将其保存在内存中 – brandall

+0

“你会建议一个监视器线程,等待几个秒,然后检查一个布尔标识符是否表示该方法被调用?“ - 个人而言,我会寻求以其他方式解决整体问题(例如,拒绝对binder的单个API调用),而不是尝试拒绝绑定。鉴于此实施使用某些东西来实现超时(例如,'View'上的'postDelayed()')可能是您的最佳选择。 “否则,将使用的上下文标记为空,并希望GC将它整理起来?” - 对不起,但我不明白这一部分。 – CommonsWare

回答

7

您可能必须创建解决方法。我在这里看到两种选择:

  • 如果请求应该被拒绝,返回一个没有任何功能的Binder。然后客户端必须检查是否有所需的功能。
  • 始终返回相同的Binder,但如果不允许调用,则让每种方法都抛出Exception(例如SecurityException)。 (这也是@CommonsWare在评论中提出的)

我想personnaly更喜欢第二种方法,因为它更灵活。 (例如,允许每个呼叫允许/拒绝,解决了重新绑定后拒绝东西的问题等)

+0

感谢您的回答 - 您可以在代码中引用bindService不同步创建服务的地方吗?对于'你确定你的onServiceConnected没有被调用?'100%是否这样不会发生在你身上?我会纠正我的问题中的措词,我认为“援引”会是更好的术语,“实例化”? – brandall

+0

最简单的显示方法是看看onBind调用的起源:它来自Handler。正如您可能知道的那样,处理程序主要用于异步(进程间)通信。 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/ActivityThread.java#1391 – F43nd1r

+0

答案的第一段完全是不正确。如果添加简单的断点,您将看到“bindService”正在等待onBind的响应,并且在此之前调用onStartCommand而不管服务是否正在运行。我不确定你的意见是什么意思 - 系统将使用IPC来传达“onBind”的响应? – brandall