Android RemoteCallbackList:
先来看下Android官网对RemoteCallbackList的说明:
Takes care of the grunt work of maintaining a list of remote interfaces, typically for the use of performing callbacks from aService to its clients. In particular, this:
- Keeps track of a set of registered
IInterfacecallbacks, taking care to identify them through their underlying uniqueIBinder(by callingIInterface.asBinder(). - Attaches a
IBinder.DeathRecipientto each registered interface, so that it can be cleaned out of the list if its process goes away. - Performs locking of the underlying list of interfaces to deal with multithreaded incoming calls, and a thread-safe way to iterate over a snapshot of the list without holding its lock.
To use this class, simply create a single instance along with your service, and call itsregister(E) and unregister(E) methods as client register and unregister with your service. To call back on to the registered clients, usebeginBroadcast(), getBroadcastItem(int), andfinishBroadcast().
If a registered callback's process goes away, this class will take care of automatically removing it from the list. If you want to do additional work in this situation, you can create a subclass that implements theonCallbackDied(E) method.
上面主要说明了:
(1)RemoteCallbackList用来保存Service的监听器的列表,通常如果service要调用Activity的方法,可以通过一个AIDL定义一个接口,将这个接口加到RemoteCallbackList中,在Service需要调用Activity代码中取出RemoteCallbackList中合适的接口调用。
(2)如果远程进程结束,那么放在RemoteCallbackList的接口会被移除。如果想在移除时候做善后工作,实现onCallbackDied(E)方法
(3) 通过接口list加锁的方式处理多线程调用,在没有获得锁情况下以一种线程安全的方式遍历这个列表的拷贝。
使用:
(1)定义AIDL接口:新建aidl文件和实现aidl接口
(2)注册:创建一个Service,用register(E)注册一个对Service的监听器;unregister(E)反注册一个对Service的监听器。
(3)调用:用到三个方法:beginBroadcast(),getBroadcastItem(int), and finishBroadcast().
int i = callbacks.beginBroadcast(); while (i > 0) { i--; try { callbacks.getBroadcastItem(i).somethingHappened(); } catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } } callbacks.finishBroadcast();
注:
beginBroadcast:拷贝回调列表,返回列表的个数
getBroadcastItem:取出回调列表中接口对象
finishBroadcast:标志RemoteCallbackLis调用结束
更多详情使用:例子链接
2万+

被折叠的 条评论
为什么被折叠?



