2012-03-13 6 views
2

Я создал службу android, которая является AccessibilityService. Из моей деятельности я хотел бы привязываться к этой службе. Нет связи между процессами, поэтому я попытался создать локальную реализацию Binder, которая просто возвращает службу (как в этом примере http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html).android bind to AccessibilityService

Проблема в том, что onBind в AccessibilityService является final, и я не могу переопределить его, чтобы вернуть свое местное связующее.

Означает ли это, что мне нужно использовать AIDL, если я хочу привязываться к сервису?

ответ

2

Нет, это означает, что вы не можете привязываться к службе, периоду. Вам необходимо переопределить onBind() для AIDL.

+0

А, я вижу. Невозможно ли связать с AccessibilityService? –

+0

@JeffStorey: Нет, поскольку они отмечены 'onBind()' как final. Они сами используют это внутренне, если заглянуть в источник «AccessibilityService». – CommonsWare

+0

Правильно, я видел это, они возвращают их реализацию. Благодарю. –

2

Вы не можете привязываться к AccessibilityService, потому что это onBind() метод объявлен окончательным. НО, вы можете использовать его экземпляр, сохраняя его в статическом поле.

В вашем MyAccessbilityService класс:

1.Create статическое поле типа вашего AccessibilityService

private static MyAccessibilityService myAccessibilityServiceInstance; 

2.Initialize это в методе onServiceConnected()

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

3 .Получите это, когда AccessibilityService отключено в методе onUnbind():

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

4.Create геттер для экземпляра и давайте добавим аннотаций @Nullable, так как мы не знаем, в какой период жизненного цикла сервиса он будет называться

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

и, наконец, в своей деятельности или где бы вы ни находились:

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

Выполнено в моем приложении, работает до сих пор. Спасибо alanv в его ответе https://stackoverflow.com/a/12557673/5502121