如何检测Android服务的绑定和解除绑定?

时间:2019-10-07 16:44:40

标签: android aidl

我有一个导出的服务,该服务向其他进程公开了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()方法,但这只会使检测更快。

有更好的方法吗?

0 个答案:

没有答案