onServiceConnected никогда не звонил после bindService метод

У меня есть конкретная ситуация: сервис, запущенный бытовым радиоприемником, запускает действие. Я хочу позволить этому действию связаться назад со службой. Я принял решение использовать AIDL для позволения. Все кажется работами, хорошими за исключением bindService() метод призван onCreate() из действия. bindService (), на самом деле, бросает исключение нулевого указателя потому что onServiceConnected() никогда не называется в то время как onBind() метод обслуживания. Так или иначе bindService() возвращает true. Служба очевидно активна, потому что она запускает действие. Я знаю, что вызов действия от сервиса мог звучать странным, но к сожалению это - единственный способ иметь распознавание речи в сервисе.

Заранее спасибо

33
задан Matroska 21 March 2010 в 10:26
поделиться

2 ответа

Я не могу составить точную проблему из вашего описания, поэтому я собираюсь здесь отгадать!

Как bindService () может вызвать исключение NullPointerException ? Это может (/ должно) произойти только тогда, когда вы не предоставляете Service или прослушиватель ServiceConnection .

bindService () не может создать исключение NullPointerException , потому что onServiceConnected () не вызывается. Вызов onServiceConnected () является продуктом bindService () .

Полагаю, вы вызываете метод AIDL до того, как служба фактически связалась?

13
ответ дан 27 November 2019 в 17:22
поделиться

После многих часов попыток разобраться в этом, проблема в том, что примеры, показывающие создание сервиса, не включают метод onBind, или в них есть следующий пример кода, или он генерирует его для вас:

public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

Это приводит к тому, что метод onServiceConnected не выполняется или вообще не выполняется. Исправление ОЧЕНЬ простое и заключается в следующем:

public IBinder onBind(Intent intent) {
    return mBinder;
}

Где вы могли бы создать простую связку, такую как следующая, чтобы вернуть:

private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
    public ConferenceService getService() {
    return ConferenceService.this;
  }
}
44
ответ дан 27 November 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: