代码先是发送”LIST”命令到ViewServer列出所有的打开的窗口,然后把每个窗口都保存起来。342行起按照源码的注释解析就是说:从协议版本3以后开始加入了窗口自动更新的功能,但是在此之前,如果用户想要获得一个获得焦点的窗口的话,需要通过显式的创建一个特殊的哈希值为-1的Window实例来完成。怎么知道它的哈希值是-1呢?请看Window类的getfocusedWindow方法:

 

  return new Window(device, "<Focused Window>", -1);  

}  

代码14-7-2 Window-getFocusedWindow方法

 

然后再看其调用的Window的构造函数和对应的传入参数:

 public Window(IHvDevice device, String title, int hashCode)  

{  

this.mHvDevice = device;  

this.mTitle = title;  

this.mHashCode = hashCode;  

this.mClient = null;  

}  

代码14-7-3 Window-构造函数

 

最终创建的就是一个标题是”<Focused Window>”,哈希值是-1的Window实例。

通过以上的示例,主要是想说明,ViewServer的版本会影响到代码的不同处理方式,所以我们还是很有必要去看下这些版本信息是如何获得和保存起来的。

好,那么我们继续分析HierarchyViewer在装备ViewServer时的方法setupViewServer最后一个调用方法DeviceBridge.loadViewServerInfo,这个方法有点长,我们对它分开来分析,先看第1部分:

 260     public static ViewServerInfo loadViewServerInfo(IDevice device) {  

261         int server = -1;  

262         int protocol = -1;  

263         DeviceConnection connection = null;  

264         try {  

265             connection = new DeviceConnection(device);  

266             connection.sendCommand("SERVER"); //$NON-NLS-1$  

267             String line = connection.getInputStream().readLine();  

268             if (line != null) {  

269                 server = Integer.parseInt(line);  

270             }  

271         } catch (Exception e) {  

272             Log.e(TAG, "Unable to get view server version from device " + device);  

273         } finally {  

274             if (connection != null) {  

275                 connection.close();  

276             }  

277         }  

    ...  

}  

代码14-7-4 DeviceBridge - loadViewServerInfo获取ViewServer版本