Страница 1 из 2

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

Добавлено: 18 июл 2012, 23:00
damager82
В этом уроке:
- используем биндинг для подключения к сервису


Click here to read this article!

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

Добавлено: 19 июл 2012, 09:28
Finch
Спаси6о что вы написали это

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

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

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


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

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

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

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

Добавлено: 19 июл 2012, 19:48
Mikhail_dev
Запуск, управление и взаимодействие с Сервисами
Чтобы запустить Сервис, вызовите метод 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

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

Добавлено: 20 июл 2012, 07:03
KamiSempai
no--, на сколько я помню, здесь это было в уроках по Intent.

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

Добавлено: 20 июл 2012, 09:21
damager82
Я забыл, что это называется явным и не явным вызовом. В 94 уроке у меня уже был неявный вызов. И в этом уроке тоже. Или это не он?

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

Добавлено: 20 июл 2012, 14:12
Mikhail_dev
Нет, это скорей всего он и есть. Хотя то же самое, что и неявный и явный вызов интента. По крайней мере я такое определение везде встречал. Поправьте если я не прав.

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 06 ноя 2012, 15:57
damager82
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.

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

Добавлено: 18 апр 2013, 04:37
neoksi
Тут заметил, что есть задержка при первичном биндинге между процессами, у меня она 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()){ код взаимодействия с сервисом основного процесса }

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

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

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

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

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

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

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

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

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

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

Добавлено: 19 апр 2013, 10:30
neoksi
Ну да, можно сказать и так, что-то типа бейсика или ассемблера.

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

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

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

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

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

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

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

[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]

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

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

Добавлено: 05 июн 2013, 12:18
Mikhail_dev
Попробуй добавить одну строку 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]