Урок 97. Service. Биндинг. ServiceConnection

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 97. Service. Биндинг. ServiceConnection

Сообщение damager82 » 18 июл 2012, 23:00

В этом уроке:
- используем биндинг для подключения к сервису


Click here to read this article!
Последний раз редактировалось damager82 22 май 2017, 23:46, всего редактировалось 6 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение Finch » 19 июл 2012, 09:28

Спаси6о что вы написали это

Вот примерно такой Lifecycle имеет биндинг сервиса. Разумеется, я рассмотрел не все возможные комбинации запуска методов startService, stopService, bindService и unbindService. Оставляю это вам, если есть интерес. Я рассмотрел только типичные случаи.

Также я не рассматривал возможность одновременного подключения нескольких приложений или сервисов к одному сервису. А такая возможность существует. В этом случае, если сервис запущен биндингом, то он будет жить, пока не отключатся все подключившиеся.

Насколько я понял по хелпу, не рекомендуется оставлять незавершенные подключения к сервисам по окончании работы приложения. В хелповских примерах подключение к сервису производится в методе onStart, а отключение - в onStop. Но, разумеется, если вам надо, чтобы подключение оставалось при временном уходе Activity в background, то используйте onCreate и onDestroy. Также есть четкая рекомендация от гугла - не использовать для этих целей onResume и onPause.


Важно помнить что в 6индинге пока есть подключение к сервису то и сервис жив
П.С. а еще хотелось 6ы что6ы рассказали пару слов о явном и не явном вызове служ6ы
CEO of a company R.id.team

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение damager82 » 19 июл 2012, 12:58

Finch писал(а):П.С. а еще хотелось 6ы что6ы рассказали пару слов о явном и не явном вызове служ6ы
Явные и неявные вызовы? Нет, не слышал :)
Скиньте плз ссылку, где пишут об этом.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение Mikhail_dev » 19 июл 2012, 19:48

Запуск, управление и взаимодействие с Сервисами
Чтобы запустить Сервис, вызовите метод startService. Вы можете произ-
вести запуск неявно, в итоге зарегистрируется соответствующий Приемник
намерений, или сделать это явно, указав класс Сервиса. Если Сервис требует
полномочий, которыми ваше приложение не располагает, вызов метода
startService приведет к выбросу исключения типа SecurityException.
В обоих случаях можно передавать значения в обработчик onStart, при-
надлежащий объекту Service, с помощью дополнительных параметров для
Намерения. В листинге 9.3 демонстрируются оба способа запуска Сервиса.
Листинг 9.3. Запуск Сервиса
// Неявный запуск Сервиса

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

Intent myIntent = new Intent(MyService.ORDER_PIZZA);
myIntent.putExtra("TOPPING", "Margherita");
startService(myIntent);
// Явный запуск Сервиса

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

startService(new Intent(this, MyService.class));
(с) Рето Майер - Android 2 - стр 373

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение KamiSempai » 20 июл 2012, 07:03

no--, на сколько я помню, здесь это было в уроках по Intent.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение damager82 » 20 июл 2012, 09:21

Я забыл, что это называется явным и не явным вызовом. В 94 уроке у меня уже был неявный вызов. И в этом уроке тоже. Или это не он?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение Mikhail_dev » 20 июл 2012, 14:12

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

Observer
Сообщения: 3
Зарегистрирован: 05 авг 2012, 13:41

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение Observer » 05 авг 2012, 13:45

"В onClickUnBind с помощью bound проверяем, что соединение уже установлено. Далее отсоединяемся методом unbindService, на вход передавая ему Intent."

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

  public void onClickUnBind(View v) {
    if (!bound) return;
    unbindService(sConn);
    bound = false;
  }
Судя по документации и вашему же коду, туда передаётся объект ServiceConnection

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение damager82 » 10 авг 2012, 10:10

Observer писал(а):"В onClickUnBind с помощью bound проверяем, что соединение уже установлено. Далее отсоединяемся методом unbindService, на вход передавая ему Intent."

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

  public void onClickUnBind(View v) {
    if (!bound) return;
    unbindService(sConn);
    bound = false;
  }
Судя по документации и вашему же коду, туда передаётся объект ServiceConnection
Абсолютно правы. Спасибо, ща пофиксю!
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение brucemax » 04 ноя 2012, 16:14

То есть ввиду
Насколько я понял по хелпу, не рекомендуется оставлять незавершенные подключения к сервисам по окончании работы приложения.
что бы у меня оставался работать сервис после завершения приложения, а во время старта приложение подключалось к сервису, необходимо в методе onCreate() выполнять сначала startService(..), а затем bindService(..). И в методе onDestroy() (в Активити) просто выполнить unbindService(). Я правильно понял?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение damager82 » 06 ноя 2012, 15:57

brucemax писал(а):То есть ввиду
Насколько я понял по хелпу, не рекомендуется оставлять незавершенные подключения к сервисам по окончании работы приложения.
что бы у меня оставался работать сервис после завершения приложения, а во время старта приложение подключалось к сервису, необходимо в методе onCreate() выполнять сначала startService(..), а затем bindService(..). И в методе onDestroy() (в Активити) просто выполнить unbindService(). Я правильно понял?
Ну да
You should usually pair the binding and unbinding during matching bring-up and tear-down moments of the client's lifecycle. For example:
If you only need to interact with the service while your activity is visible, you should bind during onStart() and unbind during onStop().
If you want your activity to receive responses even while it is stopped in the background, then you can bind during onCreate() and unbind during onDestroy(). Beware that this implies that your activity needs to use the service the entire time it's running (even in the background), so if the service is in another process, then you increase the weight of the process and it becomes more likely that the system will kill it.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 97. Service. Биндинг. ServiceConnection

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

Тут заметил, что есть задержка при первичном биндинге между процессами, у меня она 10-50мс, для себя создал следующую конструкцию, чтоб застраховаться/дождаться соединения в отдельном процессе:
[syntax=java] private void bindAc(){
if(!bound){
bindService(new Intent(this, ServiceBindAccount.class), sConn, BIND_AUTO_CREATE);
}
}

private void unbindAc(){
if (bound){
unbindService(sConn);
Account = null;
bound = false;
}
}

private boolean waitAc(){
int i = 0;
while(!bound){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
if(i>19){
i=0;
if(!bound) bindAc();
}
i++;
}
return bound;
}[/syntax]

И основном коде сервиса (находящегося в отдельном процессе), я использую проверку на существование соединения:
if(waitAc()){ код взаимодействия с сервисом основного процесса }

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

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

Re: Урок 97. Service. Биндинг. ServiceConnection

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

Не совсем понятно где в коде используется waitAc();
Есть метод onServiceConnected, в который активность заходит, когда соединилась с сервисом.
[syntax=java]
public void onServiceConnected(ComponentName className, IBinder service) {
mIGPSService = your.packagename.Stub.asInterface(service);
// mIGPSService - это и есть сервис, у которого вызывать методы
}
[/syntax]

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

Re: Урок 97. Service. Биндинг. ServiceConnection

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

no--
Да, можно все запихнуть в этот метод, когда ты выполняешь одну операцию на всё время жизни соединения, но у меня логика чуть другая.
Я инициирую соединение, беру нужные данные, далее разрываю соединение и работаю с этими данными секунд 10-100, потом инициирую соединение, когда у меня готов ответ.

То есть, мне необходимо по мере выполнения метода 2-3 раза соединиться с удаленным сервисом (вначале, в середине и конце), чтоб получить доступ к интерфейсу, для выполнения конкретных операций в нужную точку времени, но держать соединение пока обрабатываются данные мне нет необходимости.

П.С. Иногда позарез нужна линейная логика выполнения и в Java её бывает сложно реализовать.

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

Re: Урок 97. Service. Биндинг. ServiceConnection

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

Линейная логика это что-то типа ассемблера?
Ага, понял что хочешь. Но почему не держать соединение? Это ни капли не накладно.

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

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение neoksi » 19 апр 2013, 10:30

Ну да, можно сказать и так, что-то типа бейсика или ассемблера.

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

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

Re: Урок 97. Service. Биндинг. ServiceConnection

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

А почему сервис не повысить до Foreground? По своему опыту могу сказать что у нас сервис в отдельном процессе сделан по принципу foreground, что повышает его приоритет. Вот уже второй год работаем над проектом, за это время ни разу на около 7 дивайсах не было вылета из-за выгрузки его по причине нехватки ресурсов. выгружался только из-за ошибки, после чего поднимался (секунды через 3-4). А сервис у нас работает с БД, двумя нитками интернета, местоположением в связке с NMEA и вытекающей её фильтрацией и еще чертовой кучей логики. Это как бы ответ, что надо очень очень сильно постараться выгрузить.
P.S. если использовать сервис в отдельном процессе, то приложению даётся в 2 раза больше доступных ресурсов в памяти, что уменьшает риск выгрузки при сложных каких-то задачах. Это так, к слову, может пригодится.

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

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение neoksi » 19 апр 2013, 11:30

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

Аватара пользователя
brulik67
Сообщения: 16
Зарегистрирован: 17 мар 2013, 12:18

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение brulik67 » 05 июн 2013, 11:01

Ребята помогите! делаю всё как в уроке описано, но сервис не запускается и отказывается работать. В манефесте подсвечивает тег

[syntax=xml]<service android:name="MyService">[/syntax]

и пишет Exported service does not require permission. вообще вот листинг полный манифеста

[syntax=xml]<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.startandroid.develop.p0972servicebindserver"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="17" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<service android:name="MyService">
<intent-filter>
<action android:name="ru.startandroid.develop.p0972servicebindserver.MyService"/>
</intent-filter>
</service>
</application>

</manifest>[/syntax]

и в предыдущем уроке, где сервис был отдельным приложением, было то же самое.
в чём может быть проблема? :?:

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

Re: Урок 97. Service. Биндинг. ServiceConnection

Сообщение Mikhail_dev » 05 июн 2013, 12:18

Попробуй добавить одну строку android:exported="false" , как это указано в примере
[syntax=java]
<service android:name=".MyService"
android:exported="false">
<intent-filter>
<action android:name="org.example.android.myservicedemo.IService" />
</intent-filter>
</service>
[/syntax]

Ответить