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

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

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

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

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

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

无论是否从服务返回 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 {
        // ?
    }
}

我希望有人能为我提供一些启示。提前致谢。


答案 1

您可能需要创建一个解决方法。我在这里看到两个选项:

  • 如果请求应被拒绝,则返回不带任何功能的 a。然后,客户端必须检查所需的功能是否存在。Binder
  • 总是返回相同的,但如果不允许调用,让每个方法都抛出一个(例如)。(@CommonsWare在评论中也建议了这一点)BinderExceptionSecurityException

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


答案 2

推荐