{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671518037859,"data":{"id":71713915,"title":"17.5 通道管理","slug":"xdgirl","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"
说明:HMI的多屏TBT(引导、算路、定位)、视图会根据配置在BL层进行序列化,然后通过通道同步到各个视图生效。自定义数据需要HMI自行进行序列化。BL提供了两种通道模式,在通道服务初始化时设置:
boolean com.autonavi.gbl.consis.ChannelService.addObserver(IChannelProxyObserver pObserver)
boolean com.autonavi.gbl.consis.ChannelService.addObserver(IChannelObserver pObserver)
boolean com.autonavi.gbl.consis.ChannelService.addObserver(IConsisObserver pObserver)
boolean com.autonavi.gbl.consis.ChannelService.addChannel(String channelName, IChannelMessageObserver pObserver)
com.autonavi.gbl.consis.ChannelService.sendMessage(CustomChannelMessageParam param)
com.autonavi.gbl.consis.obServer.IChannelMessageObserver.onNotifyMsg(ChannelMsgHead info, ChannelParcel data)
com.autonavi.gbl.consis.ChannelParcel.writeXXX()
com.autonavi.gbl.consis.ChannelParcel.readXXX()
static void com.autonavi.gbl.consis.ChannelSerializeControl.writeToParcel(ChannelParcel parcel, RouteOption data)
static void com.autonavi.gbl.consis.ChannelSerializeControl.readFromParcel(ChannelParcel parcel,IRouteOption data)
/*< 获取通道服务实例 */\nChannelService mChannelService = (ChannelService)ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.ChannelServiceID);\nif (mChannelService == null) {\n return false;\n}\n\n/*< 从配置文件等获取当前进程的主副屏属性 */\nboolean isMaster = getConfig("isMasterDisplay");\n\n/*< 通道初始化 */\nChannelInitParam initParam = new ChannelInitParam();\ninitParam.enableConsis = true; //这里配置是否需要开启一致性\ninitParam.host = "127.0.0.1";\ninitParam.port = 1234;\n/*< 从配置文件等获取当前进程的主副屏属性 */\ninitParam.isMaster = getConfig("isMasterDisplay");\ninitParam.useInnerChannel = true;\n/*< 设置本SDK的名字,唯一标识,不可重复,主屏的SDKName内部固化,无须设置 */\ninitParam.localSdkName = "client-A";\nmChannelService.init(initParam);\n\n//1. 初始化通道服务后设置AddObserver,否则设置会失效\n//2. 释放pObserver时设置AddObserver为空防止空指针\n//3. 实现方式见下文“通道连接观察者实现”\nIChannelProxyObserver ob = new IChannelProxyObserver;\nmChannelService.addObserver(ob);\n//4. 实现方式见下文“通道创建观察者实现”\nIChannelObserver obCreate = new IChannelObserver;\nmChannelService.addObserver(obCreate);\n//5. 实现方式见下文“用户自定义数据接收”\nIChannelMessageObserver obCreate = new IChannelMessageObserver;\nmChannelService.addChannel(SdkName, IChannelMessageObserver);
class MultiChannelProxyObserver extends IChannelProxyObserver\n{\n \n @Override\n public void onChannelProxyConnect(String sdkName)\n {\n //通道连接时连接上的SdkName\n msdkName = sdkName;\n }\n\n @Override\n public void onChannelProxyDisconnect(String sdkName)\n {\n //通道断开时将保存的对应通道名字置空\n if (msdkName == sdkName)\n {\n msdkName = "";\n }\n }\n}
class MultiChannelObserver extends IChannelObserver\n{\n \n @Override\n public void onChannelCreate(String sdkName, String channelName)\n {\n //通道对象创建时回调\n msdkName = sdkName;\n mchannelName = channelName;\n }\n\n @Override\n public void onChannelDestroy(String sdkName, String channelName)\n {\n //通道断开连接回调时将保存的对应通道名字置空\n if (msdkName == sdkName)\n {\n msdkName = "";\n mchannelName = "";\n }\n }\n}
{\n if (mChannelService != NULL)\n {\n //准备要发送的数据,以下只是举例,可以封装任意数据\n //localSdkName为当前的sdkName,与InitChannelParam参照中的localSdkName一致\n //receiverSdkName为需要发送自定义消息的对象,该name在OnChannelProxyConnect回调时会通知,主屏存在多个receiverSdkName需要自行管理\n CustomChannelMessageParam messageParam = new CustomChannelMessageParam();\n messageParam.senderChannelName = localSdkName;\n messageParam.receiverChannelName = receiverSdkName;\n channelParcel data = new channelParcel;\n data.writeInt(12345678);\n data.writeString("87654321");\n writeToParcel(data, routeOption);\n messageParam.customData = data;\n mChannelService.SendMessage(messageParam);\n }\n}
class MultiChannelMessageObserver extends IChannelMessageObserver\n{\n \n @Override\n public void onNotifyMsg(ChannelMsgHead info, ChannelParcel data)\n {\n //如果onNotifyMsg回调的数据需要转线程处理,则将SDK回调的数据进行数据拷贝处理\n ChannelMsgHead channelMsgHead = new ChannelMsgHead();\n channelMsgHead.customCode = info.customCode;\n channelMsgHead.senderName = info.senderName;\n channelMsgHead.receiverName = info.receiverName;\n byte[] buf = data.getBuf() == null ? new byte[]{} : data.getBuf();\n byte[] bytes = Arrays.copyOf(buf, buf.length);\n ChannelParcel channelParcel = new ChannelParcel(bytes);\n //自定义消息通知时回调info中携带了发送者和接收者的sdkName信息\n //以读取两个整数为例,顺序与写入顺序一致.\n //数据发送方式见下文“用户自定义数据发送”\n //注意:数据发送/接收顺序需匹配,否则会引起崩溃!\n //更多用法见API手册channelParcel\n String senderName = info.getSenderName();\n String receiverName = info.getReceiverName();\n int recvInt = data->readInt();\n String recvString = data->readString();\n RouteOption recvRouteOption = readFromParcel(data);\n }\n\n @Override\n public void onChannelDestroy(String sdkName, String channelName)\n {\n //通道断开连接回调时将保存的对应通道名字置空\n if (msdkName == sdkName)\n {\n msdkName = "";\n mchannelName = "";\n }\n }\n}