2010-06-25 2 views
2

В настоящее время у меня есть служба и вид деятельности в моем приложении.Android получает услугу для связи с деятельностью?

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

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

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

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

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

Благодаря ognian за отличный совет.

EDIT 2:

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

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

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

Следующий результат логарифма может сделать все более ясным.

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

В коде Сервиса метод «public void setCallback» (ICallDialogActivity callDialogActivity) должен фактически установить глобальную ссылку Service на обратный вызов. Затем вы можете использовать его там, где это необходимо в Сервисе. Кроме того, вам нужно добавить метод removeCallback(), который вы вызовете в on-режиме Activity on(), иначе служба может в конечном итоге вызвать мертвую активность.Вы должны разработать это тщательно, потому что служба и активность имеют совершенно разные жизненные циклы. – ognian

+0

Спасибо, Огромное спасибо, я внедрил это, и теперь у меня есть понимание того, что я должен делать, однако я столкнулся с другой проблемой и отредактировал свой пост соответственно, есть понимание моего нового вопроса? –

ответ

3

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

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

void setMyCallback(inout IMyCallback myCallback); 

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

+0

Так что мне нужно идти по маршруту AIDL, не требуя Inter Process Communication? –

+1

Да, именно так разработан Android. Если приложение не распространяется на все процессы, вы можете получить какой-либо статический экземпляр getter в своей деятельности и использовать его напрямую. Я буду работать, но это не считается лучшей практикой. IPC от Android очень легковес, чтобы беспокоиться о производительности в обычных сценариях. – ognian

+0

Можете ли вы указать мне хороший учебник по этому вопросу? Кажется, я не нашел тот, где AIDL используется для разрешения методов вызова службы из Activity. –