У меня есть экспортированная служба, которая предоставляет интерфейс 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 (), но это только ускорит обнаружение.
Есть ли лучший способ?