如果你刚开始接触 Accessibility Service, 肯定知道 findAccessibilityNodeInfosByViewId()
这个函数,
他能方便的根据 View
的 id
找到这个 node
.
但它其实非常的费时, 在我的测试下, 如果用它获取QQ的文字消息, 找一次就得 50-150毫秒.
而在屏幕滚动时, 会产生非常多的 event, 用户体验极差.
从适配早期微信的不固定ID所启发, 我可以根据 node tree 从顶上找下来. 微信你ID会变, UI总不怎么变吧?
我把这一套东西搬到QQ, 根据测试好的位置直接找, 只需要 5-10毫秒就获取, 性能提升极大.
但这会花很多的开发和测试时间, 在不同的状态: 好友 群 单向好友 临时对话, 他们的UI布局会稍有不同. 但为了极致性能, 这点时间值得.
接下来要设置合理的过滤器, 过滤掉不需要的事件.
首先 在QQ的聊天界面, 它的子节点特别多, 在8-15个.
在有新消息或者滚动时, 只需要关注装消息的容器发出的事件, 也就是 AbsListView.equals(event.getClassName())
当非当前聊天对象发来消息时, 会显示在屏幕上, 这是一条 class 为 android.widget.TextView
的 event.
但这样的event太多了, 后来我发现, 会先产生一条 TYPE_WINDOW_STATE_CHANGED
, 我先在那时判断是否有这个窗口就好