最近研究了下無障礙服務,屬於初入階段吧,整理下心得。
在Android無障礙功能中,可以啓動無障礙服務以此來監控進程的使用情況,通過啓動的包名進行管理監控。
首先先記錄下如何使用無障礙服務:
1. AndroidManifest中進行相應的配置:
<service android:name=".MyService" android:enabled="true" android:exported="true" android:label="myService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" android:process=":BackgroundService"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name = "android.accessibilityservice" android:resource = "@xml/accessibility_service_config" /> </service>
2. xml文件配置,在xml文件夾下創建accessibility_service_config文件
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android=http://schemas.android.com/apk/res/android
//在服務啓動界面,用來描述此服務作用的文字說明 android:description="@string/app_accessibility_description"
//服務監控事件類型 android:accessibilityEventTypes="typeAllMask"
//服務監控後反饋的類型 android:accessibilityFeedbackType="feedbackAllMask"
//監控的包名,此項可不在xml文件中進行設置,可在代碼中進行動態設置,
或在代碼中也沒設置的情況下可對所有包名進行監控 android:packageNames="com.android.settings"
//在服務啓動界面有個設置按鈕,點擊後跳轉到的Activity android:settingsActivity="com.wantjoin.parentcontroller.MainActivity"
//發送2次事件的時間間隔,超過後事件作廢 android:notificationTimeout="100"
//此服務是否可監聽窗口內容 android:canRetrieveWindowContent="true" />
3. 創建自定義服務MyService繼承AccessibilityService實現其抽象方法:
@Override public void onAccessibilityEvent(AccessibilityEvent event) { //監控xml設置或代碼設置AccessibilityServiceInfo的進程事件 //在此方法中進行控制管理 //for example: if (event.getPackageName().equals("com.android.settings")) { Intent intent= new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //如果是服務裏調用,必須加入new task標識 intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); startActivity(new Intent(MyService.this,MainActivity.class)); } } @Override public void onInterrupt() { //服務中斷時調用 }
4. 可重寫onServiceConnected()方法進行代碼設置xml配置內容
@Override protected void onServiceConnected() { AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo(); serviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; serviceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; //在配置文件和此處都不進行監控包名設置的話,可以對所有包進行監控。 serviceInfo.packageNames = new String[]{"com.android.settings","com.wantjoin.parentcontroller"}; serviceInfo.notificationTimeout=100; setServiceInfo(serviceInfo); }