android 绑定到 AccessibilityService

Jef*_*rey 4 service binding android accessibility

我创建了一个 android 服务,它是一个AccessibilityService. 从我的活动来看,我想绑定到该服务。没有进程间通信,所以我尝试创建一个Binder只返回服务的本地实现(如本例中http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis /app/LocalService.html)。

问题是onBindin AccessibilityServiceisfinal并且我无法覆盖它以返回我的本地活页夹。

这是否意味着如果我想绑定到服务,我需要使用 AIDL?

Kir*_*zin 5

您不能绑定到 AccessibilityService,因为它是onBind()声明为 final的方法。但是,您可以通过将其存储在静态字段中来使用它的实例。

在您的MyAccessbilityService类中:

1.创建您的AccessibilityService类型的静态字段

private static MyAccessibilityService myAccessibilityServiceInstance;
Run Code Online (Sandbox Code Playgroud)

2.在方法onServiceConnected()中初始化

@Override
protected void onServiceConnected() {
    super.onServiceConnected();
    myAccessibilityServiceInstance = this;
}
Run Code Online (Sandbox Code Playgroud)

3.在 onUnbind() 方法中关闭 AccessibilityService 时清除它:

@Override
public boolean onUnbind(Intent intent) {
    myAccessibilityServiceInstance = null;
    return super.onUnbind(intent);
}
Run Code Online (Sandbox Code Playgroud)

4.为你的实例创建一个getter,让我们添加注解@Nullable,因为我们不知道它会在服务生命周期的哪个时期被调用

@Nullable
public static MyAccessibilityService getInstance(){
    return myAccessibilityServiceInstance;
}
Run Code Online (Sandbox Code Playgroud)

最后在您的 Activity 或任何您需要的地方:

    MyAccessibilityService accessibilityService = MyAccessibilityService .getInstance();
    if(accessibilityService != null){
        //do smth here:
    }
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中实现,到目前为止工作正常。感谢 alanv 在他的回复/sf/answers/879037141/