Урок 98. Service. Локальный биндинг

Обсуждение уроков
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение rezak90 » 04 сен 2012, 16:27

как по мне сервис работает сам по себе, а в контент провайдере сделать inner class которым и будет хелпер, провайдер работает с хелпером, а сервис с провайдером.
R.id.team
Политика на форуме запрещена

Imalur
Сообщения: 2
Зарегистрирован: 02 фев 2013, 22:40

Re: Урок 98. Service. Локальный биндинг

Сообщение Imalur » 14 фев 2013, 19:05

etlt писал(а):Подскажите кто сталкивался:
код из примера на строчке
myService = ((MyService.MyBinder) binder).getService();
выходит ошибка приложения и полное зависание
Класс MyBinder в MyService существует, по идеи все должно работать, но "binder" почему то не приводится к MyService.MyBinder - ошибка
аналогичная ситуация. никто не подскажет - как это побороть?

begemota
Сообщения: 1
Зарегистрирован: 06 апр 2013, 17:10

Re: Урок 98. Service. Локальный биндинг

Сообщение begemota » 06 апр 2013, 17:15

Imalur писал(а):
etlt писал(а):Подскажите кто сталкивался:
код из примера на строчке
myService = ((MyService.MyBinder) binder).getService();
выходит ошибка приложения и полное зависание
Класс MyBinder в MyService существует, по идеи все должно работать, но "binder" почему то не приводится к MyService.MyBinder - ошибка
аналогичная ситуация. никто не подскажет - как это побороть?
была аналогичная проблема... решилось очень просто...
дело в том что сервис должен запускаться в основном потоке... почти наверняка уверен что Вы в манифесте при описании сервиса использовали android:process=":nameofbindingprocess"
уберите эту строчку - и все заработает

пользуясь случаем (хе, где-то это я уже слышал, вернее видел :D ) хочу поблагодарить автора проекта... некоторые вещи почерпнул именно у Вас, т.к внятно на русском инфы по разработке для андроид очень мало

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение neoksi » 16 апр 2013, 04:28

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

Мне нужен был доступ к Singleton'у основного процесса из сервиса в другом процессе, пришлось через AIDL делать.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение brucemax » 24 апр 2013, 18:04

neoksi писал(а):Попробовал примерчик, при работе в одном процессе, все просто прекрасно, жаль так нельзя делать при разнесении элементов в разные процессы.

Мне нужен был доступ к Singleton'у основного процесса из сервиса в другом процессе, пришлось через AIDL делать.
Есть сервис, который запускается с загрузкой телефона, отслеживает координаты и с заданным интервалом отправляет их гет запросом на сервер.. Кроме того есть приложение способное просматривать некоторую инфу от сервиса, а так же выключать и включать отправку данных (да и вообще запускать и останавливать сервис). Вопрос: как вы считаете, удастся ли обойтись биндингом или придётся делать через AIDL?? Спасибо.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение neoksi » 24 апр 2013, 18:07

brucemax писал(а):
neoksi писал(а):Попробовал примерчик, при работе в одном процессе, все просто прекрасно, жаль так нельзя делать при разнесении элементов в разные процессы.

Мне нужен был доступ к Singleton'у основного процесса из сервиса в другом процессе, пришлось через AIDL делать.
Есть сервис, который запускается с загрузкой телефона, отслеживает координаты и с заданным интервалом отправляет их гет запросом на сервер.. Кроме того есть приложение способное просматривать некоторую инфу от сервиса, а так же выключать и включать отправку данных (да и вообще запускать и останавливать сервис). Вопрос: как вы считаете, удастся ли обойтись биндингом или придётся делать через AIDL?? Спасибо.
Ключевое тут слово "процесс", если указанные модули программы запускаются в одном процессе и иное не описано в их объявлении в манифесте, то подойдет локальный биндинг. Но если вы разнесли модули в разные процессы, то тут уже нужен AIDL.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение brucemax » 24 апр 2013, 18:10

neoksi писал(а): Ключевое тут слово "процесс", если указанные модули программы запускаются в одном процессе и иное не описано в их объявлении в манифесте, то подойдет локальный биндинг. Но если вы разнесли модули в разные процессы, то тут уже нужен AIDL.
Вот именно, что это разные приложения (следовательно, я подразумеваю, и процессы разные :) ). Ибо сервис у меня должен работать и без приложения.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение neoksi » 24 апр 2013, 18:24

brucemax писал(а):
neoksi писал(а): Ключевое тут слово "процесс", если указанные модули программы запускаются в одном процессе и иное не описано в их объявлении в манифесте, то подойдет локальный биндинг. Но если вы разнесли модули в разные процессы, то тут уже нужен AIDL.
Вот именно, что это разные приложения (следовательно, я подразумеваю, и процессы разные :) ). Ибо сервис у меня должен работать и без приложения.
Если разные приложения, то значит и разные процессы, в таком случае, только AIDL.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение brucemax » 24 апр 2013, 18:54

neoksi писал(а): Если разные приложения, то значит и разные процессы, в таком случае, только AIDL.
Что и требовалось доказать! Держи спасибо)))

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 98. Service. Локальный биндинг

Сообщение Mikhail_dev » 25 апр 2013, 09:36

Чисто технически вы все верно написали , но с точки зрения архитектуры, у меня вопрос. А зачем два приложения??? Можно сделать одно приложение с локальным биндингом без аидл. Оно будет прекрасно запускать сервис прим мирте телефона, не запускаю активность приложения. Можно и с аидл сделать. Делать два приложения в этом контексте задачи бессмысленно. У нас аналогичное приложение, работаем с одной программы.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение brucemax » 25 апр 2013, 13:08

no-- писал(а):Чисто технически вы все верно написали , но с точки зрения архитектуры, у меня вопрос. А зачем два приложения??? Можно сделать одно приложение с локальным биндингом без аидл. Оно будет прекрасно запускать сервис прим мирте телефона, не запускаю активность приложения. Можно и с аидл сделать. Делать два приложения в этом контексте задачи бессмысленно. У нас аналогичное приложение, работаем с одной программы.
Идея такова, что контингент пользователей будет делиться на тех, у кого только постоянно крутиться сервис (это большинство) и на тех кто может посмотреть инфу об этом сервисе, подстроить его и т.д. Можно конечно сделать всё и в одной прилаге, и допускать человека до нужных функций с помощью пароля, но тогда обычный пользователь удалив это приложение удалит и сервис, а этого бы не хотелось (есть стремление сделать пребывание сервиса как можно незаметней для пользователя). А тут у сервиса иконки никакой не будет даже и ничего не мозолит глаза.)) Только не подумайте, что это очередная шпионская программа :)
Вот хорошо, что вы спросили, это заставило посмотреть со стороны :)
P.S. Да и вообще давно пора бы уже познакомиться с этим AIDL :).. и повод нашёлся)

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 98. Service. Локальный биндинг

Сообщение Mikhail_dev » 25 апр 2013, 14:19

Тогда наперед могу сказать про аидл, что:
1. Соединение активности с сервисом проходит спустя где-то 50 миллисекунд. Так что не стоит делать bindservice и сразу вызывать методы сервиса, получишь null.
2. Для аидл нужен будет файл .aidl . Бывают с ним глюки. Project>refresh обычно помогает

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение brucemax » 25 апр 2013, 14:28

no-- писал(а):Тогда наперед могу сказать про аидл, что:
1. Соединение активности с сервисом проходит спустя где-то 50 миллисекунд. Так что не стоит делать bindservice и сразу вызывать методы сервиса, получишь null.
2. Для аидл нужен будет файл .aidl . Бывают с ним глюки. Project>refresh обычно помогает
Спасибо!!!

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение brucemax » 26 апр 2013, 18:51

no-- писал(а):Тогда наперед могу сказать про аидл, что:
1. Соединение активности с сервисом проходит спустя где-то 50 миллисекунд. Так что не стоит делать bindservice и сразу вызывать методы сервиса, получишь null.
2. Для аидл нужен будет файл .aidl . Бывают с ним глюки. Project>refresh обычно помогает
Добавил бы сюда: Дабы сохранить идентичность аидл файлов в двух разных приложения, пришлось в клиентском создавать одноимённый пакет сервиса, что бы пакеты прописанные в файлах были одинаковыми. В противном случае всё рушилось с
java.lang.SecurityException: Binder invocation to an incorrect interface
Пол часа убилось из-за этого :)

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 98. Service. Локальный биндинг

Сообщение Mikhail_dev » 26 апр 2013, 19:29

Ну это уже с точки зрения самой Java как по мне. Я такие пакеты называю обычно my.packagename.security.common
Ну или просто my.packagename.common
Найдите себе уникальное имя, зарегистрируйте домен и придерживайтесь именований пакетов.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение brucemax » 27 апр 2013, 23:14

no-- писал(а):Так что не стоит делать bindservice и сразу вызывать методы сервиса, получишь null.
Я так понимаю логично их делать после и/или в методе onServiceConnected().

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 98. Service. Локальный биндинг

Сообщение Mikhail_dev » 27 апр 2013, 23:24

Именно внутри метода onServiceConnected. Этот метод вызывается после соединения с сервисом. Это один вариант.
Второй вариант, это как писал neoksi, тут. Пример не очень правда. Другими словами, после биндинга, вызвать проверку на доступность сервиса. в цикле, с периодическими засыпаниями потока.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 98. Service. Локальный биндинг

Сообщение brucemax » 28 апр 2013, 01:04

Про цикл с периодическими засыпаниями не понял(именно его необходимость, разве недостаточно контрольной переменной в методах подключения/отключения сервиса) У меня сервис отдельное приложение. Когда прилага работающая с ним запускается, она проверяет запущен ли этот сервис и биндится к нему в зависимости от этого. В onServiceConnected() выставляю булеву переменную в тру(как в уроке), и каждый раз её проверяю. перед вызовом метода сервиса (через аидл)..

the_rest
Сообщения: 3
Зарегистрирован: 29 май 2013, 23:41

Re: Урок 98. Service. Локальный биндинг

Сообщение the_rest » 29 май 2013, 23:51

вообщем проблема такая есть сервис и с ним нужно взаимодействовать делаю так:

Код: Выделить всё

public class MusicService extends Service {

	private static final String TAG = "TAG";
	private PlayList DevicePlayList = null;
	private OnLinePlayList OnLinePlayList = null;
	private boolean Device = true;
	MyBinder binder = new MyBinder();
	
	
	public void onCreate() {
		super.onCreate();
		
		prepare_service();
	}
	
	public void onDestroy() {
		super.onDestroy();

	}
	
	public class MyBinder extends Binder {
		public MusicService getService() {
			return MusicService.this;
		}
	}  
	
	public IBinder onBind(Intent intent) {

	return binder;
	}

	private void prepare_service(){
		
		тут что делаю
	}
	
	HashMap<String, String> getTrackInform(){ // этот метод нужно вызвать в основном активити

		return DevicePlayList.GetTrackInform();
	}
вот кусок кода основного активити:

Код: Выделить всё

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.mainlayout);
		IntitView();
	}
	
	private void IntitView(){
		
		backToList = (ImageButton) findViewById(R.id.buttonListView);
		backToList.setOnClickListener(this);
		
		online_search = (ImageButton) findViewById(R.id.button_online_search);
		online_search.setOnClickListener(this);
		
		intent = new Intent(this, MusicService.class);
		
		sConn = new ServiceConnection() {
			
			@Override
			public void onServiceConnected(ComponentName name, IBinder binder) {
				music_service = ((MusicService.MyBinder) binder).getService(); //  получаем сылку обьект на сервис
				bound = true;
			}
			@Override
			public void onServiceDisconnected(ComponentName binder) {
				
				bound = false;
			}
		};
	    // стартуем сервис
	    startService(intent);
	    //bindService(intent, sConn, 0);
		
	    //change_inform_device(music_service.getTrackInform());

		gestureScanner = new GestureDetector(this);
	}
	
	@Override
	protected void onStart() {
		super.onStart();
	    bindService(intent, sConn, 0);
		HashMap<String, String> data = music_service.getTrackInform();
	}
	  
	@Override
	protected void onStop() {
		super.onStop();
	    if (!bound) return;
	    unbindService(sConn);
	    bound = false;
	}
вот, при попытке вызова метода сервиса в активити вылетает ошибка
лог :
05-30 00:49:07.931: E/AndroidRuntime(30783): FATAL EXCEPTION: main
05-30 00:49:07.931: E/AndroidRuntime(30783): java.lang.RuntimeException: Unable to start activity ComponentInfo{san_epo_21.mp3player/san_epo_21.mp3player.MainActivity}: java.lang.NullPointerException
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2084)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2111)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.access$600(ActivityThread.java:134)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1251)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.os.Handler.dispatchMessage(Handler.java:99)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.os.Looper.loop(Looper.java:137)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.main(ActivityThread.java:4666)
05-30 00:49:07.931: E/AndroidRuntime(30783): at java.lang.reflect.Method.invokeNative(Native Method)
05-30 00:49:07.931: E/AndroidRuntime(30783): at java.lang.reflect.Method.invoke(Method.java:511)
05-30 00:49:07.931: E/AndroidRuntime(30783): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
05-30 00:49:07.931: E/AndroidRuntime(30783): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
05-30 00:49:07.931: E/AndroidRuntime(30783): at dalvik.system.NativeStart.main(Native Method)
05-30 00:49:07.931: E/AndroidRuntime(30783): Caused by: java.lang.NullPointerException
05-30 00:49:07.931: E/AndroidRuntime(30783): at san_epo_21.mp3player.MainActivity.onStart(MainActivity.java:108) // вот тут показывает как раз на вызов метода из сервиса
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1136)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.Activity.performStart(Activity.java:4520)
05-30 00:49:07.931: E/AndroidRuntime(30783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2057)

в чем я ошибся 3 день мучаюсь...

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 98. Service. Локальный биндинг

Сообщение Mikhail_dev » 29 май 2013, 23:59

Сервис соединяется какое-то время. Попробуй вызвать метод сервиса в методе onServiceConnected, в самом конце. И думаю стоит убрать биндинг сервиса в onStart, раз уж он делается в onCreate.

Ответить