* A class that manages registration/unregistration of clients and manages messages to/from clients.
registerClient
* Registers a new client with the service. * * @param clientCallback the callback interface of the client to register * @param contextHubId the ID of the hub this client is attached to * * @return the client interface
IContextHubClient registerClient(
IContextHubClientCallback clientCallback, int contextHubId) {
ContextHubClientBroker broker = createNewClientBroker(clientCallback, contextHubId);
return IContextHubClient.Stub.asInterface(broker);
}
createNewClientBroker
/**
* Creates a new ContextHubClientBroker object for a client and registers it with the client
* manager.
*/
private synchronized ContextHubClientBroker createNewClientBroker(
IContextHubClientCallback clientCallback, int contextHubId) {
ContextHubClientBroker broker = null;
int id = mNextHostEndpointId;
for (int i = 0; i <= MAX_CLIENT_ID; i++) {
if (!mHostEndPointIdToClientMap.containsKey((short)id)) {
broker = new ContextHubClientBroker(
mContext, mContextHubProxy, this, contextHubId, (short)id, clientCallback);
mHostEndPointIdToClientMap.put((short)id, broker);
mNextHostEndpointId = (id == MAX_CLIENT_ID) ? 0 : id + 1;
break;
}
id = (id == MAX_CLIENT_ID) ? 0 : id + 1;
}
return broker;
}
封装IContextHubClientCallback发送到每个注册的client
onMessageFromNanoApp
/* package */ void onMessageFromNanoApp(int contextHubId, ContextHubMsg message) { NanoAppMessage clientMessage = ContextHubServiceUtil.createNanoAppMessage(message); if (clientMessage.isBroadcastMessage()) { broadcastMessage(contextHubId, clientMessage); } else { ContextHubClientBroker proxy = mHostEndPointIdToClientMap.get(message.hostEndPoint); if (proxy != null) { proxy.sendMessageToClient(clientMessage); } } } private void broadcastMessage(int contextHubId, NanoAppMessage message) { forEachClientOfHub(contextHubId, client -> client.sendMessageToClient(message)); }
/**
* Runs a command for each client that is attached to a hub with the given ID.
*/
private void forEachClientOfHub(int contextHubId, Consumer<ContextHubClientBroker> callback) {
for (ContextHubClientBroker broker : mHostEndPointIdToClientMap.values()) {
if (broker.getAttachedContextHubId() == contextHubId) {
callback.accept(broker);
}
}
}
onNanoAppLoaded ...
void onNanoAppLoaded(int contextHubId, long nanoAppId) {
forEachClientOfHub(contextHubId, client -> client.onNanoAppLoaded(nanoAppId));
}