Android绑定到AccessibilityService

4
我创建了一个Android服务,它是一个AccessibilityService。我想从我的活动中绑定到该服务。由于没有进程间通信,因此我尝试创建一个本地Binder实现,只返回服务(就像这个例子中一样http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html)。
问题在于AccessibilityService中的onBind是final的,我无法覆盖它以返回我的本地Binder。
这是否意味着如果我想要绑定服务,我需要使用AIDL?
2个回答

5

您无法绑定到AccessibilityService,因为其onBind()方法声明为final。

但是,您可以通过将其存储在静态字段中来使用其实例。

在您的MyAccessbilityService类中:

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

private static MyAccessibilityService myAccessibilityServiceInstance;

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

@Override
protected void onServiceConnected() {
    super.onServiceConnected();
    myAccessibilityServiceInstance = this;
}

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

@Override
public boolean onUnbind(Intent intent) {
    myAccessibilityServiceInstance = null;
    return super.onUnbind(intent);
}

4.为您的实例创建一个getter,并且添加注释@Nullable,因为我们不知道在服务的生命周期中它将被调用的时间。

@Nullable
public static MyAccessibilityService getInstance(){
    return myAccessibilityServiceInstance;
}

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

    MyAccessibilityService accessibilityService = MyAccessibilityService .getInstance();
    if(accessibilityService != null){
        //do smth here:
    }

我在我的应用程序中实现了这个功能,目前运行良好。感谢alanv在https://dev59.com/WWcs5IYBdhLWcg3w7IM9#12557673中的回复。


2
不,这意味着你不能绑定到该服务。你需要为AIDL重写onBind()方法。

啊,我明白了。无法绑定到AccessibilityService吗? - Jeff Storey
@JeffStorey:不行,因为他们将onBind()标记为final。如果你查看AccessibilityService源代码,你会发现他们自己在内部使用它。 - CommonsWare
好的,我看到了,他们返回了它的实现。谢谢。 - Jeff Storey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接