Комментарии 9
Я решал подобную проблему с помощью LocalBroadcastManager. Вот например тут вкратце описано.
Все сложнее, ежели вам нужно гонять туда-сюда много разных данных своего типа. Кстати, вижу у Message есть поле obj, по идее туда можно что-то свое положить, в документации написано «Objects are reference counted across processes.».
Есть еще AIDL. С его помощью можно передавать любые данные и дергать свои методы + многозадачность.
Все сложнее, ежели вам нужно гонять туда-сюда много разных данных своего типа. Кстати, вижу у Message есть поле obj, по идее туда можно что-то свое положить, в документации написано «Objects are reference counted across processes.».
Есть еще AIDL. С его помощью можно передавать любые данные и дергать свои методы + многозадачность.
Пришлось так, что нужно передавать результат — объект, но вот не могу его модифицировать поддерживать Parcelable. Решение: паттерн Mediator + static reference на объект. Последующий вызов методы Mediator вернел ссылка на объект, а static reference обнулит. Тут только одно, нужно в коде гарантированно вызывать этот метод после запрос сервиса, иначе memory leak.
Ну это так, локальное решение так сказать.
Ну это так, локальное решение так сказать.
Можно проще. Запускаем Service, все что нужно передаем в него через Intent'ы, которые будут обрабатываться в onStartCommand. В обратном направлении, из Service в Activity посылаем тоже Intent'ы, но через BroadcastReceiver. Надежно, проще, чем с bind, и что важно — без магии!) Мне нравится магия, я люблю магию, но я заметил, что она как собственный пук — нравится только Вам, а окружающие, те кому придется работать с Вашим кодом, ее ненавидят)
Если сервис — всегда ваш, и работает в том же процессе, что и Activity (подписан тем же ключём) — не нужно вообще ничего городить. Вы можете получить обычную локальную ссылку на объект сервиса и вызвать любые методы этого объекта.
Синглтон? Если нет, то пример в студию! Будет полезно!
в сервисе
в ServiceConnection внутри Activity
public class MyServiceBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
private IBinder binder = new MyServiceBinder();
public IBinder onBind(Intent arg0) {
return binder;
}
в ServiceConnection внутри Activity
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
service = ((MyService.MyServiceBinder) arg1).getService();
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Коммуникация между Activity и Service