熟悉Android开发的都知道辅助功能服务 Accessibility service。他的作用有非常多。360豌豆荚等应用市场的非root自己主动安装。微信抢红包插件。盲人辅助程序等等功能都是靠它实现的。 网上关于AccessibilityService的阐述和使用方法已经非常多非常具体了。能翻墙且英文没问题就直接看官网:http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html这里介绍个模拟自己主动点击事件的流程。

附上demo: https://github.com/jackuhan/WeChatLuckyMoney

我们写一个继承自AccessibilityService的XXXService类。在manifest中注冊下

<service
android:name=".XXXService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data android:name="android.accessibilityservice"
android:resource="@xml/accessible_service_config"/>
</service>

这里注冊了响应AccessibilityService 的intent-filter,那么这个service能够在系统触发AccessibilityEvent的时候被回调到。这个时候你的service此时会响应全部应用的同类Event,假设想仅仅响应某个特殊应用就须要使用setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo),这个须要在

onServiceConnected() 的回调中设置。

@Override
public void onServiceConnected() {
info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_VIEW_FOCUSED;
info.packageNames = new String[] {"com.example.android.myFirstApp", "com.example.android.mySecondApp"};
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
info.notificationTimeout = 100;
this.setServiceInfo(info);
}

在程序中推断有没有开启这个自己主动点击服务。

AccessibilityManager accessibilityManager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> accessibilityServices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
for (AccessibilityServiceInfo info : accessibilityServices) {
if (info.getId().equals(getPackageName() + "/.XXXService")) {
//开启了服务
}
}

假设没有开启。那么打开系统设置页面,用户点击开启。

Intent mAccessibleIntent =  new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(mAccessibleIntent);

AccessibilityService有下面几个回调

public void onAccessibilityEvent(AccessibilityEvent event);
public void onInterrupt();
public void onServiceConnected();
public void init(int connectionId, IBinder windowToken);
public boolean onGesture(int gestureId);
public boolean onKeyEvent(KeyEvent event);

onServiceConnected ()方法是AccessibilityService声明周期的一部分。在系统成功与服务绑定后才被呼叫,假设用来设定AccessibilityServiceInfo.这种方法更为方便。

这里须要在onAccessibilityEvent的回调中得到AccessibilityEvent ,

通过AccessibilityEvent.getSource()方法可以从资源中获得窗体的内容和行为,AccessibilityNodeInfo。通过findAccessibilityNodeInfosByViewId()或者findAccessibilityNodeInfosByText()方法可以确定我们要点击的button;

,然后performAction  ACTION_CLICK就可以就完毕了点击名称为"Name"的控件的事件了。

onAccessibilityEvent(AccessibilityEvent event)  {
AccessibilityNodeInfo nodeInfo = event.getSource()
List<AccessibilityNodeInfo> fetchNodes = nodeInfo.findAccessibilityNodeInfosByText("Name");
AccessibilityNodeInfo openNode = fetchNodes.get(int i);
openNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}

Android 4.0版本号中添加了一个新特性,就是可以用AccessibilityService来遍历View层级。并从产生Accessibility 事件的组件与它的父子组件中提取必要的信息。为了实现这个目的,你须要配置:android:canRetrieveWindowContent="true"。

同一时候Android 4.0版本号開始,可以使用XML文件来配置这类service。

格式例如以下所看到的:

<accessibility-service
android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
android:packageNames="com.example.android.myFirstApp, com.example.android.mySecondApp"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"
android:canRetrieveWindowContent="true"
/>

假设你使用了xml配置service的方式。确保在manifest中声明 <meta-data>这个标签内容。指定该service保存在res/xml/serviceconfig.xml中,比如这样:

<service android:name=".MyAccessibilityService">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data android:name="android.accessibilityservice"
android:resource="@xml/serviceconfig" />
</service>

Accessibility辅助控制类的更多相关文章

  1. .net之工作流工程展示及代码分享(四)主控制类

    现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...

  2. PHP-权限控制类

    http://blog.csdn.net/painsonline/article/details/7183679 <?php /** * 权限控制类 */ class include_purvi ...

  3. 类型转换辅助工具类TypeCaseHelper

    package org.sakaiproject.util; import java.math.BigDecimal; import java.sql.Date; import java.sql.Ti ...

  4. python 通过元类控制类的创建

    一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...

  5. Day 5-8 自定义元类控制类的实例化行为

    __call__方法: 对象后面加括号,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类( ...

  6. 【HLSDK系列】服务端实体 edict_t 和 控制类

    我们来了解一下引擎是怎么管理实体的吧!我们这里就说说服务端的实体(edict_t) 服务端用 edict_t 这个结构体来保存一个实体,可以说一个 edict_t 就是一个 服务端实体,下文简称实体. ...

  7. PHP-权限控制类(转)

    <?php /** * 权限控制类 */ class include_purview { /** * 类的唯一实例 */ private static $instance; /** * 权限常量 ...

  8. scratch教程:学做控制类积木

    少儿编程中scratch很容易被小孩所接受,不管是从外观还是教程中,都符合少儿的兴趣,为此现在只要是开少儿编程课都会有scratch课程,今天娜娜姐小码王scratch培训机构就为大家分享,scrat ...

  9. java多线程(六)线程控制类

    1.   多线程控制类 为了保证多线程的三个特性,Java引入了很多线程控制机制,下面介绍其中常用的几种: l  ThreadLocal l  原子类 l  Lock类 l  Volatile关键字 ...

随机推荐

  1. 简单易学的机器学习算法——神经网络之BP神经网络

    一.BP神经网络的概念     BP神经网络是一种多层的前馈神经网络,其基本的特点是:信号是前向传播的,而误差是反向传播的.详细来说.对于例如以下的仅仅含一个隐层的神经网络模型: watermark/ ...

  2. hdu 4997 Biconnected

    这题主要是计算连通子图的个数(c)和不连通子图的个数(dc)还有连通度为1的子图的个数(c1)和连通度为2以上的子图的个数(c2)之间的转化关系 主要思路大概例如以下: 用状态压缩的方法算出状态为x的 ...

  3. flume採集数据导入elasticsearch 配置

    Flume启动通常会报两种错,一种是log4j没有配置,第二种就是缺少各种jar包.SO: [root@laiym ~]# cp /usr/local/elasticsearch/lib/*/usr/ ...

  4. linux虚拟机网络设置(本机使用wiff,自己的网)

      一.linux虚拟机网络设置(https://jingyan.baidu.com/album/4e5b3e1957979d91901e24f1.html?picindex=16) 选中虚拟机,点击 ...

  5. Gzip压缩优化网站

    网站常使用GZIP压缩算法对网页内容进行压缩,然后传给浏览器,以减小数据传输量,提高响应速度.浏览器接收到GZIP压缩数据后会自动解压并正确显示.GZIP加速常用于解决网速慢的瓶颈. 压缩Filter ...

  6. 转换Arcgis Server REST接口实现OL2直接调用

    概述: 本文解说怎样通过Arcgis Server REST 的导出地图(Export)接口.实如今OL2中直接以WMS的方式调用Arcgis Server REST服务. 实现思路: 1.rest的 ...

  7. UI设计师不可不知的安卓屏幕知识-安卓100分享

    http://www.android100.org/html/201505/24/149342.html UI设计师不可不知的安卓屏幕知识-安卓100分享 不少设计师和工程师都被安卓设备纷繁的屏幕搞得 ...

  8. listView 多个item布局

    package kds.szkingdom.wo.android.adapter; import java.util.List; import android.content.Context; imp ...

  9. 关于requestAnimationFrame()和cancelAnimationFrame()与定时器之间的比较

    在渲染页面动画的时候,其实也没有必要用定时器(setInterval),其实requestAnimationFrame()和cancelAnimationFrame()也能达到相应的效果,他是HTML ...

  10. C#实现软件监控外部程序运行状态的方法

    本文实例讲述了C#实现软件监控外部程序运行状态的方法.分享给大家供大家参考.具体方法如下: 需要外挂一个程序,用于监控另一个程序运行状态,一旦检测到另一程序关闭,就触发一个事件做其他处理. using ...