一、前言

自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来。但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导致了。或许是网络的原因,而且这个也是最大的原因。但是其他的不可忽略的因素也是要考虑到进去的,比如在手机充电锁屏的时候,我们并不知道有人已经开始发红包了,那么这时候也是让我们丧失了一大批红包的原因。那么关于网络的问题,我们开发者可能用相关技术无法解决(当然在Google和Facebook看来的话,他们的理想是能够在任何地方都能连接互联网,当然在偏远的农村也是,不过我们期待他们有一天能够普及开来。到时候才是真正的互联网)。扯得有点远了。我们回归到正题,今天我们来看看使用技术来解决其他非网络问题。在充电锁屏的时候也可以自动帮我们抢红包。而且你要知道,机器抢红包的准确率是100%的,这个也许就是人和机器的区别。那么保证抢得准确率是100%的话,那就依赖于我们高效准确的算法实现了。下面就来看看原理实现。


当去年我看到抢红包那么火爆的时候,当时作为一个开发者心里是多么渴望开发一个插件出来,可是当时我们能想到的就是使用:

adb shell monkey

命令去模拟点击屏幕,但是那种方式有一个问题就是是无头绪的盲目点击,所以几乎会出现误点,点击成功率极其低下。所以当时就没有想到其他方法了,因为最近做了有关辅助功能相关的工作的时候,那么就发现这个功能可以用于抢红包。


其实现在我们可以去各大市场搜索一下看到,有很多抢红包的插件了。当然我们并不是用于商业化,这里只是来解析一下原理。我们会发现那些插件都有一个共同的特点是:第一步都是引导用户去开启辅助功能


二、原理解析

关于辅助功能(AccessibilityService),如果又不了解的同学可以去Google一下,这个功能其实很有用的,但是他的出现的出发点是给那些肢体上有障碍的人使用的,比如手指不健全的用户,怎么才能滑动屏幕,然后打开一个应用呢?那么辅助功能就是干这些事,他的功能其实就是可以概括两句话:

第一、寻找到我们想要的View节点

第二、然后模拟点击,实现特定功能

我们知道Android中的View体系是一个树形结构,那么每一个View就是一个节点。所以我们可以查找到指定的节点,那么我们该如何查找到我们想要的节点呢?这里我们先看一下辅助功能(AccessibilityService)的用法

第一步、我们需要集成AccessibilityService类

我们需要自定一个Service然后继承AccessibilityService,当然还需要在AndroidManifest.xml中声明这个服务