Android получает Сервис для связи с Деятельностью? - PullRequest
2 голосов
/ 25 июня 2010

У меня в данный момент есть Служба и Активность в моем приложении.

В настоящее время я привязываю Службу к действию, не используя AIDL, так как Служба и Задание находятся в одном приложении.

Это позволяет мне вызывать методы из Сервиса в рамках моей Деятельности, когда мне это требуется, однако не позволяет мне вызывать методы Деятельности из моего Сервиса, когда я этого хочу.

Кто-нибудь может прокомментировать, как лучше всего это сделать?

Я мог бы использовать Intents, но есть ли альтернатива?

Я хочу иметь тесную связь между Сервисом и Активностью, хочу иметь возможность вызывать метод Активности из моей Сервиса, когда происходит событие.

Спасибо Огниану за отличный совет.

РЕДАКТИРОВАТЬ 2:

Теперь у меня все работает так, как я хочу, однако я столкнулся с проблемой.

Моя служба получает обновления статуса, и моя активность должна реагировать на обновления, отправленные службой.

Проблема в том, что, когда я начинаю свою деятельность, я получаю статус набора номера, а затем статус подключения, прежде чем вызывается onBind, и я получаю экземпляр iCallDialogActivity.

Следующий вывод из logcat может прояснить ситуацию.

06-28 10:56:48.702: DEBUG/TestPhone(3498): Status: EStatusDialling
06-28 10:56:48.751: DEBUG/TestPhone(3498): Status: EStatusConnected
06-28 10:56:49.122: DEBUG/TestPhone(3498): Status: onBind Called    <------------- 
06-28 10:56:49.141: DEBUG/TestPhone(3498): Status: iCallDialogActivity instance  <------------- 
06-28 10:56:51.641: DEBUG/TestPhone(3498): Status: EStatusDisconnecting
06-28 10:56:51.651: DEBUG/TestPhone(3498): Status: EStatusIdle

Мне нужно иметь возможность использовать iCallDialogActivity при получении уведомлений о наборе номера и состоянии соединения.

Но это дает мне исключение NullPointer из-за того, что оно не было создано во время начала моей активности, привязка - это первое, что я делаю в своей деятельности onCreate ().

Есть ли способ заставить его связываться сразу?

1 Ответ

3 голосов
/ 25 июня 2010

Вы не можете напрямую вызывать методы в экземпляре своей Activity, вы должны использовать тот же механизм IPC, который вызываете методы Service через AIDL.

Во-первых, вам нужно объявить некоторые методы, которые вы хотите представить, в качестве обратных вызовов. Сделайте это в отдельном файле .aidl. Затем добавьте установщик для этого обратного вызова в AIDL Сервиса, например:

void setMyCallback(inout IMyCallback myCallback);

если вы сделали IMyCallback.aidl. Не забудьте import указать его в .aidl Сервиса, даже если он находится в том же пакете. В своей деятельности создайте экземпляр заглушки из этого .aidl и передайте его службе, прежде чем перезвонить.

...