передать информацию из службы переднего плана деятельности - PullRequest
4 голосов
/ 25 февраля 2011

У меня в андроиде есть сервис, который постоянно тянет сенсорную информацию и отправляет ее через сетевой интерфейс.

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

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

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

Полагаю, это наиболее распространенный случай «локальной» службы, то есть, выполняющейся в том же процессе, что и действия.

Существует два решения, одно из которых отправляет службу намерениям в действия.которые регистрируют и отменяют регистрацию правильных BroadcastReceiver в onStart() и onStop().

Другой работает с механизмом слушателя.Вы можете получить ссылку на экземпляр службы, как объяснено здесь .Записав в сервис метод setListener(ServiceListener l) и интерфейс ServiceListener, вы сможете внедрить слушателя в свою деятельность и настроить его в службе.

Намеренный способ может быть проще и менее рискованным,но вам придется придерживаться дополнительных функций для обмена данными.

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

1 голос
/ 13 июня 2012

По своему опыту я нашел, что лучше привязать мои действия к сервису, используя

bindService(new Intent( this, ClassroomService.class), mConnection, Context.BIND_AUTO_CREATE );

Как только сервис привязан, я отправляю сообщение из моей деятельности в службу регистрации сообщений о действиях.обработчик в Activity Service Connection onServiceConnected ().

public void onServiceConnected( ComponentName className, IBinder service )
{
    MyService mService = new Messenger(service);
    Message msg = Message.obtain(null, MyService.MSG_REGISTER_CLIENT );
    msg.replyTo = mMessenger;
    mService.send(msg);
}

На стороне службы, когда он получил это сообщение, я сохраняю обработчик, переданный в члене replyTo, и использую этот обработчик для отправки сообщений обратно в "зарегистрированоЕсли никакие действия в настоящее время не зарегистрированы, сообщение игнорируется.

При откреплении от службы я также отправляю MyService.MSG_UNREGISTER_CLIENT, чтобы сообщить службе очистить сохраненную ссылку на обработчик.

Если выпривязать к службе в ваших действиях onResume () и отменить привязку на onPause (), тогда действие будет получать сообщения только тогда, когда оно находится на переднем плане.

Надеюсь, что это поможет.

...