Android工具HierarchyViewer 代码导读(3) -- 后台代码
2016-06-12 14:43
676 查看
在上文中,我们讲解了如何把HierarchyViewer的项目导入到Eclipse中,以便更高效阅读代码。本文将讲解HierarchyViewer的后台代码,建议大家可以先阅读<Android工具HierarchyViewer代码导读(1) -- 功能实现演示>一文, 其中的代码演示了HierarchyViewer的主要功能。而本文就是讲解HierarchyViewer是如何实现功能的。
把复杂的代码讲解清楚一般都不是很容易的事情,为了不把本文写成流水帐,文章将尽量集中在HierarchyViewer后台代码的主要脉络上,许多细节需要读者自己去阅读,那是必须的。
MVC模式
HierarchyViewer采用典型的MVC模式设计。
当打开HierarchyViewer,进入主界面时,其对应的MVC模式是:HierarchyViewerDirector.java是Controller,DeviceSelectionModel.java是Model,DeviceSelector是View,如下图所示:
当双击某个Acitivity,进入浏览层次图界面时,其对应的MVC模式是:HierarchyViewerDirector.java是Controller,TreeViewModel.java是Model,Views是TreeViewController.java、TreeViewOverview.java、PropertyViewer.java、TreeViewer.java、LayoutViewer.java:
HierachyViewerDirector.java(即Controller)通过DeviceBridge.java来和Android设备通信,而DeviceBridge.java具体是通过AndroidDebugBridage.java和DeviceConnection.java来和设备通信。如下图所示:
AndroidDebugBridge.java : AndroidDebugBridge.java是ADB API,位于ddmlib项目中。 它实现了命令行版adb一样的功能,在HierarchyViewer中主要用到其连接设备,forward端口,启动ViewServer等操作。
DeviceConnection.java: 负责和ViewServer通信,向ViewServer发送命令并接受其返回的信息。从而获取Activity列表、控件层次结构图、截图等。
入口点
后台代码的入口点在HierarchyViewerApplication.java的createContents method中:
在这个方法中做了如下事情:
1)DeviceBridge.setupDeviceForward(device) -- 把该设备的4939端口映射到本地端口。 HierarchyViewer维护一个列表 --sDevicePortMap,它记录哪个设备被映射到了哪个本地端口。
2)DeviceBridge.isViewServerRunning(device) -- 判断该设备的ViewServer是否打开。
3)DeviceBridge.startViewServer(device) -- 打开ViewServer。
4)loadViewServerInfoAndWindows(device) -- 1)获取该设备ViewServer信息,比如版本信息等 2)获取该设备其所有活动的Activities(在HierarchyView源代码中,Activities总是被命名为Windows)。
(如果读者不明白以上函数的意义,再次建议阅读<功能实现演示>)
让我们"Step Into”,来看看loadViewServerInfoAndWindows方法:
1,DeviceBridge.loadViewServerInfo(device) -- 读取ViewServer信息。
2,DeviceBridge.loadWindows(device) -- 发送 “LIST”命令给ViewServer,读取设备所有活动的Activities。
3,DeviceSelectionModel.getModel().addDevice(device, windows, viewServerInfo) -- 更新DeviceSelectionModel数据,然后该Model将通过事件通知Views来更新显示。
我们到哪了?
在以上代码完成后,HierarchyViewer完成了主界面的加载,已经连接的设备及其活动的Activities显示出来了:
[url=http://images.cnblogs.com/cnblogs_com/vowei/201208/201208080853136057.png]
把复杂的代码讲解清楚一般都不是很容易的事情,为了不把本文写成流水帐,文章将尽量集中在HierarchyViewer后台代码的主要脉络上,许多细节需要读者自己去阅读,那是必须的。
MVC模式
HierarchyViewer采用典型的MVC模式设计。
当打开HierarchyViewer,进入主界面时,其对应的MVC模式是:HierarchyViewerDirector.java是Controller,DeviceSelectionModel.java是Model,DeviceSelector是View,如下图所示:
当双击某个Acitivity,进入浏览层次图界面时,其对应的MVC模式是:HierarchyViewerDirector.java是Controller,TreeViewModel.java是Model,Views是TreeViewController.java、TreeViewOverview.java、PropertyViewer.java、TreeViewer.java、LayoutViewer.java:
HierachyViewerDirector.java(即Controller)通过DeviceBridge.java来和Android设备通信,而DeviceBridge.java具体是通过AndroidDebugBridage.java和DeviceConnection.java来和设备通信。如下图所示:
AndroidDebugBridge.java : AndroidDebugBridge.java是ADB API,位于ddmlib项目中。 它实现了命令行版adb一样的功能,在HierarchyViewer中主要用到其连接设备,forward端口,启动ViewServer等操作。
DeviceConnection.java: 负责和ViewServer通信,向ViewServer发送命令并接受其返回的信息。从而获取Activity列表、控件层次结构图、截图等。
入口点
后台代码的入口点在HierarchyViewerApplication.java的createContents method中:
public void deviceConnected(final IDevice device) {
executeInBackground("Connecting device", new Runnable() {
public void run() {
if (DeviceSelectionModel.getModel().containsDevice(device)) {
windowsChanged(device);
} else if (device.isOnline()) {
DeviceBridge.setupDeviceForward(device);
if (!DeviceBridge.isViewServerRunning(device)) {
if (!DeviceBridge.startViewServer(device)) {
// Let's do something interesting here... Try again
// in 2 seconds.
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
if (!DeviceBridge.startViewServer(device)) {
Log.e(TAG, "Unable to debug device " + device);
DeviceBridge.removeDeviceForward(device);
} else {
loadViewServerInfoAndWindows(device);
}
return;
}
}
loadViewServerInfoAndWindows(device);
}
}
});
}
在这个方法中做了如下事情:
1)DeviceBridge.setupDeviceForward(device) -- 把该设备的4939端口映射到本地端口。 HierarchyViewer维护一个列表 --sDevicePortMap,它记录哪个设备被映射到了哪个本地端口。
2)DeviceBridge.isViewServerRunning(device) -- 判断该设备的ViewServer是否打开。
3)DeviceBridge.startViewServer(device) -- 打开ViewServer。
4)loadViewServerInfoAndWindows(device) -- 1)获取该设备ViewServer信息,比如版本信息等 2)获取该设备其所有活动的Activities(在HierarchyView源代码中,Activities总是被命名为Windows)。
(如果读者不明白以上函数的意义,再次建议阅读<功能实现演示>)
让我们"Step Into”,来看看loadViewServerInfoAndWindows方法:
private void loadViewServerInfoAndWindows(final IDevice device) { ViewServerInfo viewServerInfo = DeviceBridge.loadViewServerInfo(device); if (viewServerInfo == null) { 4000 return; } Window[] windows = DeviceBridge.loadWindows(device); DeviceSelectionModel.getModel().addDevice(device, windows, viewServerInfo); if (viewServerInfo.protocolVersion >= 3) { WindowUpdater.startListenForWindowChanges(HierarchyViewerDirector.this, device); focusChanged(device); } }
1,DeviceBridge.loadViewServerInfo(device) -- 读取ViewServer信息。
2,DeviceBridge.loadWindows(device) -- 发送 “LIST”命令给ViewServer,读取设备所有活动的Activities。
3,DeviceSelectionModel.getModel().addDevice(device, windows, viewServerInfo) -- 更新DeviceSelectionModel数据,然后该Model将通过事件通知Views来更新显示。
我们到哪了?
在以上代码完成后,HierarchyViewer完成了主界面的加载,已经连接的设备及其活动的Activities显示出来了:
[url=http://images.cnblogs.com/cnblogs_com/vowei/201208/201208080853136057.png]
相关文章推荐
- Android工具HierarchyViewer 代码导读(2) -- 建立Eclipse调试环境
- Android工具HierarchyViewer 代码导读(1) -- 功能实现演示
- Android关于PagerAdapter的使用方法的总结
- ANDROID L——Material Design详解(主题和布局)
- Android 系统服务一览表
- Android Service完全解
- Android 5.X 新特性详解(三)——Activity过渡动画
- Android SDK Manager无法更新的解决方案
- android 控制listview 的滑动速度
- Android学习笔记二之Android基础
- android简单的socket通讯
- Android 蓝牙开发基本流程
- android自定义View绘制几何图形
- Android开发笔记(一百零五)社会化分享SDK
- android audiotrack 播放pcm
- Android中TextView加横线的属性
- 单例模式及其在Android中的应用
- Androidstudio 设置永久行号
- Android 开发命名规范
- MVP模式在Android项目中的使用