Android AccessibilityService源码分析

本文详细分析了 Android 中 AccessibilityService 的工作原理,包括 onKeyEvent、onAccessibilityEvent 等关键方法的实现。通过 AccessibilityService 的源码,揭示了 AccessibilityManagerService 如何与 AccessibilityService 进行进程间通信,以及在用户开启或关闭辅助功能时如何触发服务连接。同时,文章还探讨了 PackageMonitor 在监听服务变化中的作用,并展示了 AccessibilityService 的 onBind 方法何时被调用。
摘要由CSDN通过智能技术生成
AccessibilityService首先你要继承AccessibilityService,你会被要求复写
onKeyEvent、onIntercept、onAccessibilityEvent等方法。我们看这些方法在AccessibilityService中是如何实现的。

public class AccessBackKeyService extends AccessibilityService {
        private static final String TAG = "jason";

        @Override
        protected boolean onKeyEvent(KeyEvent event) {
            Log.i(TAG, "onKeyEvent");

            if(event.getAction() == KeyEvent.ACTION_DOWN){
                return super.onKeyEvent(event);
            }
            Log.i(TAG, "onKeyEvent ACTION_DOWN");

            int key = event.getKeyCode();
            switch(key){
                case KeyEvent.KEYCODE_VOLUME_DOWN:
                    Log.i(TAG, "KEYCODE_VOLUME_DOWN");
                    break;
                case KeyEvent.KEYCODE_VOLUME_UP:
                    Log.i(TAG, "KEYCODE_VOLUME_UP");
                    Toast.makeText(this, "KEYCODE_VOLUME_UP", Toast.LENGTH_SHORT).show();
                    break;
                case KeyEvent.KEYCODE_BACK:

                    Log.i(TAG, "KEYCODE_BACK");
                    Toast.makeText(this, "KEYCODE_BACK, source:"+event.getSource(), Toast.LENGTH_SHORT).show();
                    break;
                case KeyEvent.KEYCODE_ESCAPE:
                    Log.i(TAG, "KEYCODE_ESCAPE");
                    Toast.makeText(this, "KEYCODE_ESCAPE", Toast.LENGTH_SHORT).show();
                    break;
            }
            return super.onKeyEvent(event);
        }



        @Override
        public void onInterrupt() {

        }

        @Override
        public void onCreate() {
            super.onCreate();
        }

        @Override
        public void onAccessibilityEvent(AccessibilityEvent event) {
            // TODO Auto-generated method stub

        }

    @Override
    protected boolean onGesture(int gestureId) {
        Log.i("jason", "onGesture:"+gestureId);
        return super.onGesture(gestureId);
    }
}



我们看到AccessibilityService中有一个接口

/**
 * @hide
 */
public interface Callbacks {
    public void onAccessibilityEvent(AccessibilityEvent event);
    public void onInterrupt();
    public void onServiceConnected();
    public void init(int connectionId, IBinder windowToken);
    public boolean onGesture(int gestureId);
    public boolean onKeyEvent(KeyEvent event);
    public void onMagnificationChanged(@NonNull Region region,
            float scale, float centerX, float centerY);
    public void onSoftKeyboardShowModeChanged(int showMode);
    public void onPerformGestureResult(int sequence, boolean completedSuccessfully);
}



AccessibilityService利用观察者模式的形式将自己封装进一个IAccessibilityServiceClientWrapper内部类中,在onBind方法中实现,猜测在辅助功能打开开关的时候,onBind这个方法将被调用,一会我们从源码分析,先分析一下 IAccessibilityServiceClientWrapper
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值