Как обнаружить привязку и отмену привязки службы Android? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть экспортированная служба, которая предоставляет интерфейс AIDL другим процессам. Интерфейс AIDL использует обратные вызовы . Может быть от 0 до n клиентов, которые связывают сервис одновременно. Клиент часто отменяет привязку службы.

Пример:

interface ImageProviderAidl {
  void fetchImageSubscribe(in String clientId, in String uri, int requestId, BitmapCallback callback);
  void fetchImageDispose(int requestId);
}

interface BitmapCallback {
    void onNext(in Bitmap bitmap);
    void onComplete();
    void onError(String message);
}

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

Проблема в том, что обратные вызовы, которые предоставляются клиентом, который больше не связывает сервис, все еще ссылаются на сервис . Как я могу обнаружить и удалить такие обратные вызовы? Предотвращают ли эти обратные вызовы сбор мусора на стороне клиента?

До сих пор я придумал только специальный метод "clearCallbacks (clientId: String)" в службе, который будет вызываться до того, как клиенты отсоединят службу. Это потребует, чтобы клиенты вели себя и вызывали метод вовремя. Другим недостатком является то, что он не является детерминированным в случае, если клиентские приложения уничтожаются, не давая им возможности вызвать метод, если в системе недостаточно памяти. Я получу RemoteException при попытке вызвать «мертвый» обратный вызов, но до тех пор он останется и будет использовать ресурсы. Другая идея состоит в том, чтобы использовать какой-нибудь метод checkHeartbeat (), но это только ускорит обнаружение.

Есть ли лучший способ?

...