AccessibilityService在官網上的介紹如下:
An accessibility service runs in the background and receives callbacks by the system when AccessibilityEvent
s
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.
大致的意思是它是一個運行在後臺的服務,並且能夠接受到系統和用戶之間的交互信息,如按鈕的點擊,焦點變化等,它的主要功能如下:
一、獲取當前UI信息
二、監聽event(用戶的操作)
三、響應控件
我個人覺得以上三點其實和uiautomator非常像,一和三這兩點其實就是一個腳本工具的基本功能了,當然,uiautomator的會簡單而且容易上手,但AccessibilityService的速度也要比uiautomator,而且功能也更全,比如用AccessibilityService去寫搶紅包就會比uiautomator更合適。
好了,廢話不多說,這篇先說說AccessibilityService的使用。
1、聲明
需要在 AndroidManifest.xml 中聲明一個Service, 但是需要配置intent-filter爲android.accessibilityservice.AccessibilityService,還需要添加BIND_ACCESSIBILTY_SERVICE的權限
<service
android:name=".MyAccessibilityService"
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/accessibility" />
</service>
2、配置
用來指定輔助事件的類型,以及監聽包名等。
有兩種方式,一種是通過xml來指定,這種方式需要在Service中添加meta-data屬性
<?xml version="1.0" encoding="UTF-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
android:accessibilityFeedbackType="feedbackSpoken"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100" />
還有一種方式是通過setServiceInfo方法去配置,一般都會在onServiceConneted(在服務連接成功的時候調用)方法中去調用它。如:
<pre name="code" class="java">@Override
protected void onServiceConnected() {
Log.i(TAG, "config success!");
AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();
//指定包名
accessibilityServiceInfo.packageNames = PACKAGES;
//指定事件類型
accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
accessibilityServiceInfo.notificationTimeout = 1000;
setServiceInfo(accessibilityServiceInfo);
}
3、編寫輔助Service
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
public class MyAccessibilityService extends AccessibilityService {
private static final String TAG = MyAccessibilityService.class.getName();
private String[] PACKAGES = {"com.android.mms"};
public MyAccessibilityService() {
}
@Override
protected void onServiceConnected() {
Log.i(TAG, "config success!");
AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();
//指定包名
accessibilityServiceInfo.packageNames = PACKAGES;
//指定事件類型
accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
accessibilityServiceInfo.notificationTimeout = 1000;
setServiceInfo(accessibilityServiceInfo);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
String eventText = "";
Log.i(TAG, "==============Start====================");
switch (eventType) {
case AccessibilityEvent.TYPE_VIEW_CLICKED:
eventText = "TYPE_VIEW_CLICKED";
break;
case AccessibilityEvent.TYPE_VIEW_FOCUSED:
eventText = "TYPE_VIEW_FOCUSED";
break;
case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED:
eventText = "TYPE_VIEW_LONG_CLICKED";
break;
case AccessibilityEvent.TYPE_VIEW_SELECTED:
eventText = "TYPE_VIEW_SELECTED";
break;
case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
eventText = "TYPE_VIEW_TEXT_CHANGED";
break;
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
eventText = "TYPE_WINDOW_STATE_CHANGED";
break;
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
eventText = "TYPE_NOTIFICATION_STATE_CHANGED";
break;
case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END:
eventText = "TYPE_TOUCH_EXPLORATION_GESTURE_END";
break;
case AccessibilityEvent.TYPE_ANNOUNCEMENT:
eventText = "TYPE_ANNOUNCEMENT";
break;
case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START:
eventText = "TYPE_TOUCH_EXPLORATION_GESTURE_START";
break;
case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER:
eventText = "TYPE_VIEW_HOVER_ENTER";
break;
case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT:
eventText = "TYPE_VIEW_HOVER_EXIT";
break;
case AccessibilityEvent.TYPE_VIEW_SCROLLED:
eventText = "TYPE_VIEW_SCROLLED";
break;
case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED:
eventText = "TYPE_VIEW_TEXT_SELECTION_CHANGED";
break;
case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
eventText = "TYPE_WINDOW_CONTENT_CHANGED";
break;
}
eventText = eventText + ":" + eventType;
Log.i(TAG, eventText);
Log.i(TAG, "=============END=====================");
}
@Override
public void onInterrupt() {
}
}
最後,在設置--輔助功能中 將對應的service開啓即可,這個例子是用來監聽信息應用的。