AccessibilityService详解

最近想做一个微信添加好友功能,所以到处研究如何实现该功能。然后买了一本C++的书从头研究到尾,从main函数的使用到标准库以及C++新特性的开发,而且向公司借了一本关于linux编辑shell命令的研究,接着把ndk和jni研究了一篇,最后把jni和linux内核inotify文件观察器研究了一遍,最终能使用jni写底层C去执行了shell命令,而且还做了一个使用inotify监听app应用文件夹删除即卸载的功能。后面我听说有微信抢红包的功能,我就想了一下。
我的微信添加好友功能是这样的->首先打开微信->监听微信上的控件->在应用上点击搜索好友界面->输入手机号码->点击搜索按钮进入详细资料->自动点击添加通讯录进入微信发送界面->自动点击发送->添加好友完成。整个流程就是这样子的。那么这个微信抢红包与我这个功能有何关系呢?我随下下载了微信抢红包的源码。结果发现AccessibilityService这个对象。那么我们来一场AccessibilityService的详解。
随后看了google的AccessibilityService这个对象的翻译:
An accessibility service runs in the background and receives callbacks by the system when AccessibilityEvents are fired. Such events denote some state transition in the user interface, for example, the focus has changed, a button has been clicked, etc. Such a service can optionally request the capability for querying the content of the active window. Development of an accessibility service requires extending this class and implementing its abstract methods。
英文翻译过来就是:一个辅助服务在后台运行,并在系统重启时辅助激发事件接收回调。这样的事件表示在用户界面中的一些状态转移,例如,焦点已改变,一个按钮被点击等这样的服务可以选择请求的能力,用于查询活动窗口的内容。辅助功能服务的发展需要扩展此类和实现它的抽象方法。
这段话说明了AccessibilityService这个对象是一个辅助类。可以作为文字转语音(这个不支持中文),触觉反馈,手势操作,轨迹球和手柄操作。
结构
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public abstract class AccessibilityService extends Service  
  2. java.lang.Object  
  3. Android.content.Context  
  4.         android.content.ContextWrapper  
  5.                android.app.Service  
  6.                           android.accessibilityservice.AccessibilityService  
AccessibilityService继承了service,我们可以得知他是在后台运行的。那么这个对象应该也有Service的生命周期吧!
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class IAccessbilityService extends AccessibilityService {  
  2. /** 
  3. * 当启动服务的时候就会被调用 
  4. */  
  5. @Override  
  6. protected void onServiceConnected() {  
  7. super.onServiceConnected();  
  8. }  
  9.   
  10. /** 
  11. * 监听窗口变化的回调 
  12. */  
  13. @Override  
  14. public void onAccessibilityEvent(AccessibilityEvent event) {  
  15.   
  16. }  
  17.   
  18. /** 
  19. * 中断服务的回调 
  20. */  
  21. @Override  
  22. public void onInterrupt() {  
  23.   
  24. }  
  25. }  

使用这个打开启动服务的界面

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. try {  
  2.     Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);  
  3.     startActivity(intent);  
  4. catch (Exception e) {  
  5.     e.printStackTrace();  
  6. }  
下面3个图是执行步骤:



当你点击了确认后就会回调执行onServiceConnected这个函数,那么什么时候会调用onAccessibilityEvent这个函数呢?说这个之前我们先来配置一下AccessibilityService服务。
配置文件的步骤:
1.创建类继承AccessibilityService
2.配置AccessibilityService服务就如同配置Service一样
3.配置AccessibilityService的xml文件


第一步我们已经配置了,我们配置第二步:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <service  
  2.     android:name=".IAccessbilityService"  
  3.     android:enabled="true"  
  4.     android:exported="true"  
  5.     android:label="@string/automatic_installation"  
  6.     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >  
  7.     <intent-filter>  
  8.         <action android:name="android.accessibilityservice.AccessibilityService" />  
  9.     </intent-filter>  
  10.   
  11.     <meta-data  
  12.         android:name="android.accessibilityservice"  
  13.         android:resource="@xml/accessibility_service_config" />  
  14. </service>  
这个配置跟service配置很相似,android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"配置打开绑定服务的权限.
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <meta-data  
  2.     android:name="android.accessibilityservice"  
  3.     android:resource="@xml/accessibility_service_config" />  
这个是配置AccessibilityServiceInfo这个对象。name必须是android.accessibilityservice,resource是配置xml资源。
第三步,accessibility_service_config文件配置AccessibilityServiceInfo:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged|typeWindowsChanged"  
  4.     android:accessibilityFeedbackType="feedbackGeneric"  
  5.     android:accessibilityFlags="flagDefault"  
  6.     android:canRetrieveWindowContent="true"  
  7.     android:description="@string/description"  
  8.     android:notificationTimeout="100"  
  9.     android:packageNames="com.tencent.mm" />  
我们分析xml的所有属性:
android:accessibilityEventTypes这个属性主要是配置监控的对象,
android:accessibilityFeedbackType这个属性配置手机用什么方式将信息反馈给用户,语音震动等等,这里默认;
android:description这个可以看第一个上图,那么description文字就是这个描述。
android:canRetrieveWindowContent它是获取窗口上的对象的值,由于要获取窗口上的值,所以这个属性必须填写。
notificationTimeout这个是设置超时的时间。
android:packageNames这个是监控应用包名,这个包名是数组,可以监控多个应用。
如果要看得更多可以到:https://developer.android.com/reference/android/R.styleable.html#AccessibilityService_accessibilityFlags
这三步启动完成后就可以测试了。当包名为com.tencent.mm这个应用的窗口改变的时候就会回调
onAccessibilityEvent这个函数。
当然如果不配置
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <meta-data  
  2.         android:name="android.accessibilityservice"  
  3.         android:resource="@xml/accessibility_service_config" />  
这个的时候,那么我们也可以设置
// 大多数的手机包名一样,联想部分机型的手机不一样
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private String[] packageNames = { "com.android.packageinstaller",  
  2.         "com.lenovo.security""com.lenovo.safecenter" };  
  3. @Override  
  4. protected void onServiceConnected() {  
  5.     super.onServiceConnected();  
  6.     AccessibilityServiceInfo mAccessibilityServiceInfo = new AccessibilityServiceInfo();  
  7.     // 响应事件的类型,这里是全部的响应事件(长按,单击,滑动等)  
  8.     mAccessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;  
  9.     // 反馈给用户的类型,这里是语音提示  
  10.     mAccessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;  
  11.     // 过滤的包名    
  12.     mAccessibilityServiceInfo.packageNames = packageNames;  
  13.     setServiceInfo(mAccessibilityServiceInfo);  
  14. }  
通过setServiceInfo这个函数也可以配置AccessibilityServiceInfo.
好了,大致我们把AccessibilityService详解也讲完了,后面我会讲 《使用AccessibilityService带你自动安装软件以及自动添加微信好友》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值