第一時(shí)間獲取Python技術(shù)干貨!
閱讀文本大概需要 8 分鐘。
聊到 App 端的自動(dòng)化,大家能想到的可能是 Appium、UIAutomator2、Airtest 等一系列自動(dòng)化框架。
Android 系統內置了一個(gè) 無(wú)障礙服務(wù),能完成一系列自動(dòng)化操作;相比其他自動(dòng)化框架,無(wú)障礙服務(wù)可以能完全脫離 PC 端,手機也不需要獲取 Root 權限。另外,無(wú)障礙服務(wù)操作起來(lái)更加高效、更加智能。
今天,我們來(lái)聊聊無(wú)障礙服務(wù),后續一系列項目實(shí)戰將使用這個(gè)方案來(lái)實(shí)現。
谷歌官方對無(wú)障礙服務(wù)的定義如下:無(wú)障礙服務(wù)是一個(gè)為殘疾人或可能暫時(shí)無(wú)法與設備完全互動(dòng)的人提供用戶(hù)界面擴展功能的應用程序無(wú)障礙服務(wù)提供了一個(gè)服務(wù),方便我們操作一些應用完成一系列定義好的操作。
很多手機廠(chǎng)商內置的搶紅包提醒功能就是利用 Android 系統提供的無(wú)障礙服務(wù)實(shí)現的。
要開(kāi)啟無(wú)障礙服務(wù),只需要 5 個(gè)簡(jiǎn)單的步驟即可實(shí)現。
使用 Android Studio 新建一個(gè) Android 項目
創(chuàng )建無(wú)障礙服務(wù)的配置文件
創(chuàng )建一個(gè)無(wú)障礙服務(wù)的子類(lèi),并配置 AndroidManifest 文件
重寫(xiě)服務(wù)的方法,針對頁(yè)面變化、內容變化、通知變化,編寫(xiě)業(yè)務(wù)邏輯
開(kāi)啟無(wú)障礙服務(wù)
無(wú)障礙服務(wù)配置文件 可以配置無(wú)障礙服務(wù)監聽(tīng)的應用和事件。
其中,packageNames 指定監聽(tīng)的應用程序對象的應用包名;accessibilityEventTypes 指定要監聽(tīng)的事件類(lèi)型;description 為無(wú)障礙服務(wù)的描述信息;notificationTimeout 是事件發(fā)送的時(shí)間間隔,一般默認為 100 毫秒。
比如,微信的typeWindowStateChanged、typeWindowContentChanged 兩個(gè)事件,事件發(fā)送時(shí)間為 100 毫秒。
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"
android:accessibilityFeedbackType="feedbackAllMask"
android:canRetrieveWindowContent="true"
android:description="@string/service_wechat_description"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm" />
然后,新建一個(gè) 無(wú)障礙服務(wù)的子類(lèi),重寫(xiě)無(wú)障礙服務(wù)內的 3 個(gè)方法。
public class WeChatService extends AccessibilityService{
@Override
public void onAccessibilityEvent(AccessibilityEvent event)
{
//監聽(tīng)事件
}
@Override
public void onInterrupt()
{
//服務(wù)斷開(kāi)
}
@Override
protected void onServiceConnected()
{
super.onServiceConnected();
//服務(wù)開(kāi)啟
}
}
onAccessibilityEvent(event) 可以拿到對拿到目標應用配置文件中配置的事件類(lèi)型,針對每一個(gè)事件類(lèi)型,可以編寫(xiě)對應的應用邏輯。
onServiceConnected() 方法在無(wú)障礙服務(wù)被開(kāi)啟的同時(shí),會(huì )被觸發(fā)。
onInterrupt() 方法在服務(wù)被終端的時(shí)候觸發(fā)。
接著(zhù),需要在項目的配置文件 AndroidManifest.xml 中 配置服務(wù),并指定上面編寫(xiě)的配置文件。
<service
android:name=".WeChatService"
android:enabled="true"
android:exported="true"
android:label="@string/service_wechat_label"
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/config_accessibility" />
</service>
最關(guān)鍵的是 編寫(xiě)事件的邏輯,根據配置文件中指定的事件類(lèi)型和頁(yè)面元素,包含類(lèi)型、包名、頂部 Activity 來(lái)編寫(xiě)響應的邏輯。
比如,要實(shí)現搶紅包的功能,就需要對頁(yè)面更新和內容更新兩個(gè)事件進(jìn)行處理,如果頁(yè)面元素中出現了紅包的標識,就獲取到紅包所在的元素,執行點(diǎn)擊操作,就可以實(shí)現搶紅包的這一操作。
最后,就是 打開(kāi)無(wú)障礙服務(wù)。
在布局文件中放一個(gè)按鈕,判斷無(wú)障礙服務(wù)是否打開(kāi),如果沒(méi)有打開(kāi),就跳到無(wú)障礙服務(wù)設置界面,手動(dòng)打開(kāi)即可。
/**
* 檢查當前無(wú)障礙服務(wù)是否開(kāi)啟
*
* @param serviceName 服務(wù)名稱(chēng)
* @return 服務(wù)是否啟用
*/
@SuppressLint("LongLogTag")
public boolean checkAccessibilityEnabled(String serviceName)
{
List<AccessibilityServiceInfo> accessibilityServices =
mAccessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
for (AccessibilityServiceInfo info : accessibilityServices)
{
Log.e("checkAccessibilityEnabled", info.getId());
if (info.getId().equals(serviceName))
{
return true;
}
}
return false;
}上面的步驟介紹了使用無(wú)障礙服務(wù)的完整流程,基于此,我們使用一部手機,就能完成應用內大部分的自動(dòng)化操作。
后續我將利用 一系列項目,帶大家一步步地進(jìn)行學(xué)習和項目實(shí)戰。
聯(lián)系客服