Подтвердить что ты не робот

Удаленная служба запрещает разрешение на Bind

У меня есть удаленная служба, с которой могут привязываться внешние приложения. Бывают ситуации, когда я могу отказаться от привязки. В соответствии с документацией,

Верните канал связи в службу. Может возвращать null, если клиенты не могут привязываться к службе.

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

Возвращение null действительно не возвращает объект IBinder и, следовательно, предотвращает соединение, однако вызывающее приложение неправильно получает эту "информацию".

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

Верно ли null или нет из Сервиса, это всегда возвращает true?

В соответствии с документацией,

Возвращает - если вы успешно привязаны к службе, true вернулся; false возвращается, если соединение не создано, поэтому вы не получать объект службы

Я предположил, что возврат null из onBind привел бы к тому, что bindService вернет false. Предположения никогда не являются хорошей идеей...

Возвращаемое значение null, тем не менее, не позволяет ServiceConnection быть вызванным экземпляром, но последствием этого будет отсутствие возможности проверить, связующее на самом деле является нулевым в onServiceConnected.

Итак, мой вопрос - как приложение "знает", если запрос привязки был отклонен?

Кроме того, если я решаю на лету, что запрос onRebind (ранее возвращаемый true из onUnbind) должно быть отклонено, я, похоже, не могу переопределить поведение, чтобы предотвратить это:

@Override
public void onRebind(final Intent intent) {

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

Надеюсь, кто-то может пролить свет на меня. Спасибо заранее.

4b9b3361

Ответ 1

Вам, вероятно, придется создать обходной путь. Здесь я вижу два варианта:

  • Верните a Binder без каких-либо функций, если запрос должен быть отклонен. Затем клиент должен проверить, есть ли требуемая функциональность.
  • Всегда возвращайте те же Binder, но пусть каждый метод бросает Exception (например, SecurityException), если вызов не разрешен. (Это также было предложено @CommonsWare в комментариях)

Я бы предпочел бы второй подход, поскольку он более гибкий. (например, разрешает разрешение/запрет на вызовы, решает проблему отказа от материала после повторной привязки и т.д.)