通過(guò)源碼角度看看AccessibilityService-創(chuàng)新互聯(lián)

簡(jiǎn)介

專(zhuān)業(yè)從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì),高端網(wǎng)站制作設(shè)計(jì),小程序定制開(kāi)發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠(chéng)服務(wù),采用H5高端網(wǎng)站建設(shè)+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站,讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過(guò)程建立專(zhuān)項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。

AccessibilityService的設(shè)計(jì)初衷是為了輔助有身體缺陷的群體使用Android應(yīng)用,它的設(shè)計(jì)貫穿著Android的控件樹(shù)View, ViewGroup, ViewRootImpl體系。借助于system_server進(jìn)程的中轉(zhuǎn),能夠注冊(cè)Accessibility事件的客戶(hù)端可以具備通過(guò)system_server提供的Accessibility服務(wù)來(lái)實(shí)現(xiàn)監(jiān)聽(tīng)、操作其它應(yīng)用視圖的功能。這個(gè)功能十分強(qiáng)大,可以模擬用戶(hù)的行為去操作其它APP,常常被用在自動(dòng)化測(cè)試、微信搶紅包、自動(dòng)回復(fù)等功能實(shí)現(xiàn)中。

寫(xiě)這個(gè)的初衷有二:

  • 之前已經(jīng)完成了Android View控件樹(shù)的繪制、事件分發(fā)的源碼分析,知識(shí)儲(chǔ)備足夠
  • 最近接觸到了一些自動(dòng)化方面的項(xiàng)目,并且對(duì)使用無(wú)障礙服務(wù)實(shí)現(xiàn)的自動(dòng)微信搶紅包功能原理十分好奇

整體圖


類(lèi)圖

  • AccessibilityService: APP端直接繼承的類(lèi),本質(zhì)上是Service,通過(guò)onBind獲取匿名Binder對(duì)象實(shí)現(xiàn)通信
  • IAccessibilityServiceClientWrapper: 用于和system_server通信的匿名Binder服務(wù)
  • AccessibilityInteractionClient: 本質(zhì)上是個(gè)binder服務(wù),用于獲取Node信息
  • AccessibilityManagerService: 運(yùn)行在system_server的實(shí)名binder服務(wù),是整體的管理類(lèi)
  • Service: AccessibilityManagerService的內(nèi)部類(lèi),用于響應(yīng)AccessibilityInteractionClient的binder通信請(qǐng)求
  • AccessibilityInteractionConnection: 運(yùn)行在被監(jiān)測(cè)的APP端,提供查找、點(diǎn)擊視圖等服務(wù)
  • AccessibilityManager: 運(yùn)行在各個(gè)APP端,用于發(fā)送視圖變化事件
  • AccessibilityInteractionController: 具體視圖查找、點(diǎn)擊服務(wù)的中間控制器
  • AccessibilityNodeProvider: 由客戶(hù)端實(shí)現(xiàn)的視圖節(jié)點(diǎn)內(nèi)容提供者,最終操作的實(shí)現(xiàn)者

整體設(shè)計(jì)圖

實(shí)例代碼

public class AutoDismissService extends AccessibilityService {
 @Override
 public void onAccessibilityEvent(AccessibilityEvent event) {
 if (event == null) {
 return;
 }
 
 // 自動(dòng)將android系統(tǒng)彈出的其它c(diǎn)rash dialog取消
 dismissAppErrorDialogIfExists(event);
 }
 
 private void dismissAppErrorDialogIfExists(AccessibilityEvent event) {
 // WINDOW視圖變化才進(jìn)行對(duì)應(yīng)操作
 if ((event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
 && event.getPackageName().equals("android")) {
 // 查找?guī)в?OK"字符的可點(diǎn)擊Node
 AccessibilityNodeInfo nodeInfo = findViewByText("OK", true);
 if (nodeInfo != null) {
 // 查找到后執(zhí)行點(diǎn)擊操作
 performViewClick(nodeInfo);
 }
 }
 public AccessibilityNodeInfo findViewByText(String text, boolean clickable) {
 // 獲取當(dāng)前窗口父節(jié)點(diǎn)
 AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow();
 if (accessibilityNodeInfo == null) {
 return null;
 }
 // 獲取到滿(mǎn)足字符要求的節(jié)點(diǎn)
 List<AccessibilityNodeInfo> nodeInfoList = accessibilityNodeInfo.findAccessibilityNodeInfosByText(text);
 if (nodeInfoList != null && !nodeInfoList.isEmpty()) {
 for (AccessibilityNodeInfo nodeInfo : nodeInfoList) {
 if (nodeInfo != null && (nodeInfo.isClickable() == clickable)) {
  return nodeInfo;
 }
 }
 }
 return null;
 }
 
 public void performViewClick(AccessibilityNodeInfo nodeInfo) {
 if (nodeInfo == null) {
 return;
 }
 // 由下至上進(jìn)行查詢(xún),直到尋找到可點(diǎn)擊的節(jié)點(diǎn)
 while (nodeInfo != null) {
 if (nodeInfo.isClickable()) {
 nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
 break;
 }
 nodeInfo = nodeInfo.getParent();
 }
 }
}

標(biāo)題名稱(chēng):通過(guò)源碼角度看看AccessibilityService-創(chuàng)新互聯(lián)
分享路徑:http://muchs.cn/article18/djjigp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、App設(shè)計(jì)、響應(yīng)式網(wǎng)站、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站改版服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)