远程服务拒绝对绑定的权限

bra*_*all 17 java android android-service android-binder

我有一个远程服务,外部应用程序可以绑定到该服务.在某些情况下,我可能希望拒绝绑定.根据文件,

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

@Override
public IBinder onBind(final Intent intent) {
    return null;
}
Run Code Online (Sandbox Code Playgroud)

返回null确实不会返回IBinder对象,因此会阻止连接,但是调用应用程序无法正确接收此"信息".

boolean bound = context.bindService(intent, serviceConnection, flagsHere);
Run Code Online (Sandbox Code Playgroud)

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

根据文件,

返回 - 如果已成功绑定到服务,则返回true; 如果未建立连接,则返回false,因此您将不会收到服务对象

我曾假设从onBind返回null 会导致bindService返回false.假设永远不是一个好主意......

但是,返回null确实会阻止ServiceConnection实例化调用,但是这样做的结果就是没有选项来检查绑定在onServiceConnected中是否实际为null .

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

另外,如果我在飞行中决定对onRebind(先前从onUnbind返回true )的请求应该被拒绝,我似乎无法覆盖行为以防止这种情况:

@Override
public void onRebind(final Intent intent) {

    if (shouldAllowRebind(intent)) {
        super.onRebind(intent);
    } else {
        // ?
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望有人可以为我解释一下.提前致谢.

F43*_*d1r 7

您可能需要创建一个变通方法.我在这里看到两个选项:

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

我个人更喜欢第二种方法,因为它更灵活.(例如,允许每次呼叫许可/拒绝,解决重新绑定后拒绝内容的问题等)