Google为了让Android系统更实用,为用户提供了无障碍辅助服务(AccessibilityService
).
AccessibilityService
运行在后台,并且能够收到由系统发出的一些事件(AccessibilityEvent
,这些事件表示用户界面一系列的状态变化),比如焦点改变,输入内容变化,按钮被点击了等等,该种服务能够请求获取当前活动窗口并查找其中的内容.换言之,界面中产生的任何变化都会产生一个时间,并由系统通知给AccessibilityService
.这就像监视器监视着界面的一举一动,一旦界面发生变化,立刻发出警报.
A项目-模拟程序
模拟一个按钮点击
findViewById(R.id.btn_click).settext("模拟点击");
findViewById(R.id.btn_click).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(MainActivity.this, "我被点击了!!!", Toast.LENGTH_SHORT).show();
Log.i(TAG, "onClick: 我被点击了!!!");
}
});
B项目-监听程序
public class ListeningService extends AccessibilityService { private static final String TAG = "WindowChange"; @Override protected void onServiceConnected() { super.onServiceConnected(); AccessibilityServiceInfo config = new AccessibilityServiceInfo(); //配置监听的事件类型为界面变化|点击事件 config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED | AccessibilityEvent.TYPE_VIEW_CLICKED; config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; if (Build.VERSION.SDK_INT >= 16) { config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; } setServiceInfo(config); } @Override public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo nodeInfo = event.getSource();//当前界面的可访问节点信息 if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {//界面变化事件 ComponentName componentName = new ComponentName(event.getPackageName().toString(), event.getClassName().toString()); ActivityInfo activityInfo = tryGetActivity(componentName); boolean isActivity = activityInfo != null; if (isActivity) { Log.i(TAG, componentName.flattenToShortString()); //格式为:(包名/.+当前Activity所在包的类名) //如果是模拟程序的操作界面 if (componentName.flattenToShortString().equals("com.botaoweb.blackdoplanet/.viewController.home.HM1100SignActivity")) { //当前是模拟程序的主页面,则模拟点击按钮 if (android