AccessibilityService是Android官方給出的一個無障礙輔助的API,可以實現(xiàn)一系列Android自動化行為,諸如自動化測試、自動搶紅包、自動安裝應(yīng)用、清理系統(tǒng)運存、劫持瀏覽器、等等。
AccessibilityService快速集成
繼承系統(tǒng)AccessibilityService
AccessibilityService是抽象類,要實現(xiàn)它的抽象方法。
public class MyAccessibilityService extends AccessibilityService {
private static final String TAG = "MyAccessibilityService";
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//此處寫事件的處理,常用eventType和className來做判斷。
int eventType = event.getEventType();
String className = event.getClassName().toString();
Log.d(TAG, "當(dāng)前事件類型:" + eventType);
Log.d(TAG, "當(dāng)前執(zhí)行類名:" + className);
//根據(jù)不同的eventType和className,來進(jìn)行具體的事件處理
}
@Override
public void onInterrupt() {
}
}
寫配置文件
有兩種方式,一種是在資源文件夾下新建xml文件夾,然后新建一個xml格式的文件來寫配置。
<?xml version="1.0" encoding="UTF-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:description="@string/accessibility_description"
android:packageNames="com.tencent.mm,com.android.systemui" />
accessibilityEventTypes:要監(jiān)聽的事件類型。
accessibilityFeedbackType:反饋方式,有語音播出和振動。
description:開啟服務(wù)處處看到的描述信息。
packageNames:要監(jiān)控的應(yīng)用的包名,多應(yīng)用包名用英文逗號隔開。
配置文件的其他屬性含義參考:
http://blog.csdn.net/zhou452840622/article/details/51734677
另一種方式是復(fù)寫AccessibilityService中的onServiceConnected方法,在里面設(shè)置參數(shù)信息。參數(shù)含義與xml形式的配置的屬性一一對應(yīng)。
該方法可以在運行期間動態(tài)修改服務(wù)配置。
注意:動態(tài)配置方法只能用來配置動態(tài)屬性:eventTypes,feedbackType,flags,notificaionTimeout及packageNames。
@Override
protected void onServiceConnected() {
// 如果僅僅在此處配置,就new一個AccessibilityServiceInfo;
AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo();
// 如果需要與xml配置方式混用,就用getServiceInfo
// AccessibilityServiceInfo serviceInfo = getServiceInfo();
serviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
serviceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
serviceInfo.packageNames = new String[] { "com.tencent.mm","com.android.systemui" };
serviceInfo.notificationTimeout = 100;//單位:毫秒
//設(shè)置配置
setServiceInfo(serviceInfo);
super.onServiceConnected();
}
注冊服務(wù)
與一般服務(wù)注冊方式基本一致,如果是使用xml來寫的配置,則在AndroidManifest.xml中注冊的同時,用meta-data標(biāo)簽配置。
注意:
1、meta-data標(biāo)簽只對4.0以上系統(tǒng)可用,如需兼容4.0以下,可以用代碼動態(tài)的來配置。
2、不能在一個service里同時寫兩個或多個這樣的配置文件,一次只能寫一個meta-data標(biāo)簽,比較復(fù)雜的業(yè)務(wù)邏輯可以用動態(tài)配置的方式來控制。
<service
android:name="com.sk.androidauto.service.MyAccessibilityService"
android:enabled="true"
android:exported="true"
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_systemui" />
//不能在一個service里同時寫兩個或多個這樣的配置文件,一次只能寫一個meta-data標(biāo)簽,比較復(fù)雜的業(yè)務(wù)邏輯可以用動態(tài)配置的方式來控制
<!-- <meta-data -->
<!-- android:name="android.accessibilityservice" -->
<!-- android:resource="@xml/accessibility_wx" /> -->
</service>
手動啟用服務(wù)
安裝完實現(xiàn)了AccessibilityService的應(yīng)用后,需要到系統(tǒng)的“設(shè)置--其他高級設(shè)置--輔助功能”里找到該應(yīng)用,“開啟服務(wù)”。
不需要在代碼里start或bind。

至此,AccessibilityService已經(jīng)集成完成,可以根據(jù)自己的業(yè)務(wù)邏輯來寫代碼了。
使用AccessibilityService來自動模擬操作的常用操作和注意點參考我的另一篇文章:
Android自動化之AccessibilityService模擬操作(經(jīng)驗總結(jié))
另外,AccessibilityService使用起來受限很大,不能做到諸如隨意點擊屏幕任意一點等操作,許多情況下,可能還需要結(jié)合adb命令來共同實現(xiàn)某些操作,使用adb命令來自動模擬操作請參考:
Android自動化之a(chǎn)db模擬操作(可實現(xiàn)按鍵精靈和手機輸入法)