Урок 94. Service. Подробно про onStartCommand

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

Урок 94. Service. Подробно про onStartCommand

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

В этом уроке:
- рассмотрим подробнее метод onStartCommand


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

semsorock
Сообщения: 2
Зарегистрирован: 23 мар 2012, 14:26

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение semsorock » 10 июл 2012, 16:20

Могли бы Вы, пожалуйста, объяснить, для чего использовались знаки "&" в этом методе:

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

void readFlags(int flags) {
    if ((flags&START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY) 
      Log.d(LOG_TAG, "START_FLAG_REDELIVERY");  
    if ((flags&START_FLAG_RETRY) == START_FLAG_RETRY) 
      Log.d(LOG_TAG, "START_FLAG_RETRY");
  }
Спасибо!

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение damager82 » 11 июл 2012, 13:43

Это битовые операции. Тут можно почитать об этом: http://informatics.mccme.ru/moodle/mod/ ... pterid=306

Если flags содержит флаг START_FLAG_REDELIVERY, то эта операция flags&START_FLAG_REDELIVERY вернет именно этот флаг. При этом flags может содержать еще кучу других флагов.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение rezak90 » 23 июл 2012, 11:57

у меня что то не понятки с манифестом, пишет что не может найти активити в проекте где только сервис. Как должен выглядеть манифест?
R.id.team
Политика на форуме запрещена

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение damager82 » 23 июл 2012, 15:25

У меня так:

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.startandroid.develop.p0942servicekillserver"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service android:name="MyService">
            <intent-filter>
                <action android:name="ru.startandroid.develop.p0942servicekillserver.MyService"/>
            </intent-filter>
        </service>
    </application>

</manifest>
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

htk
Сообщения: 5
Зарегистрирован: 10 июл 2012, 10:09

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение htk » 27 июл 2012, 11:41

rezak90 писал(а):у меня что то не понятки с манифестом, пишет что не может найти активити в проекте где только сервис. Как должен выглядеть манифест?
Была таже проблема в итоге решение оказалось в packages в папке src, я добавил класс MyServer в пустой деволтный пакет: (default package), а путь в то время как он должен был находиться в - com.example.p0942_servicekillserver (у Вас возможно по другому). Обычный перенос класса MyService в правильный пакет решил все вопросы =)

У меня вот другой прикол flags постоянно возвращает 0 вместо START_FLAG_RETRY

if ((flags&START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY)
Log.d(Log_tag, "START_FLAG_REDELIVERY");
if ((flags&START_FLAG_RETRY) == START_FLAG_RETRY)
Log.d(Log_tag, "START_FLAG_RETRY");

Alukard
Сообщения: 1
Зарегистрирован: 27 июл 2012, 22:11

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение Alukard » 27 июл 2012, 22:19

Всем привет. Вопрос к знающим людям:

Сделал урок под копирку, за исключением того, что и активити и сервис в одном приложении, но :
Я раскидал сервис и приложение по разным проектам для большей наглядности. А вообще, организовать работу сервиса и приложения в разных процессах можно было и в одном проекте (в одном Application). Для этого в манифесте для сервиса надо прописать атрибут: android:process=":newproc". Вместо newproc можно использовать свое слово.
В итоге:
- если подождать 15 секунд то все окей, за исключением того, что процесс останется висеть - это нормально?
- если кикнуть процесс, то потом он запустится, но в логах будет :

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

MyService onCreate
MyService onStartCommand, name = value
START_FLAG_RETRY
MyRun#1 create
MyRun#1 start
MyService onCreate
И все, процесс висит и ничего не происходит.
В итоге процесс просто не уничтожить, восстанавливается постоянно)
Заранее спасибо за помощь.

UPD 1

Андроид 2.33

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение damager82 » 30 июл 2012, 10:21

Alukard писал(а): В итоге:
- если подождать 15 секунд то все окей, за исключением того, что процесс останется висеть - это нормально?
- если кикнуть процесс, то потом он запустится, но в логах будет :

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

MyService onCreate
MyService onStartCommand, name = value
START_FLAG_RETRY
MyRun#1 create
MyRun#1 start
MyService onCreate
То, что висит процесс - я думаю, это нормально. Скорее всего сейчас системе не нужны ресурсы и она не убивает процесс.

А вот вручную его не можете убить, потому что у вас stopSelf по каким-то причинам не срабатывает (в логах нет onDestroy). А onStartCommand возвращает START_STICKY наверно? Система думает, что процесс работу не завершил и постоянно восстанавливает его.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Overdos
Сообщения: 33
Зарегистрирован: 09 авг 2012, 20:58
Откуда: Краснодар

Re: Урок 77. Tab - вкладки. TabActivity. Activity, как содер

Сообщение Overdos » 26 окт 2012, 22:10

Всем привет!не знаю как создавать темы новых уроков! так что сорри ... вопрос такой !
Урок 94! цитирую: Прописываем сервис в манифесте и добавляем к нему IntentFilter c action = ru.startandroid.develop.p0942servicekillserver.MyService.

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

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

Re: Урок 77. Tab - вкладки. TabActivity. Activity, как содер

Сообщение damager82 » 30 окт 2012, 09:24

Overdos писал(а):Всем привет!не знаю как создавать темы новых уроков! так что сорри ... вопрос такой !
Урок 94! цитирую: Прописываем сервис в манифесте и добавляем к нему IntentFilter c action = ru.startandroid.develop.p0942servicekillserver.MyService.
Скажите, в каком манифесте это прописывать ??? пробывал разные варианты, ни чего не получается ((( Пожалуйста помогите.... Спасибо заранее!
Темы по урокам создаются автоматически. Ссылка в конце урока.
Про манифест было в первом уроке про сервисы - Урок 92. Если совсем не работали с манифестом - то смотрите Урок 21.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение brucemax » 31 окт 2012, 00:52

Я правильно понимаю, если ставить атрибут android:process=":newproc", то сервис выполняется в другом потоке, и создавать runnable класс для выполнения тяжёлых задач не обязательно?

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение rezak90 » 31 окт 2012, 01:14

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

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение brucemax » 31 окт 2012, 15:03

rezak90 писал(а):да, если задачи длительные то предпочтительней юзать сервисы а не потоки.
Эм.. ? То ли я не всё понимаю, толи вы сформулировали неправильно. Я спрашивал к тому, что по умолчанию сервис выполняется в том же потоке что и создавшее его приложение. И чтобы не "зависало" ui из-за него, в сервисе создают новый поток и выполняют задачи там (как в уроках). Вот и вопрос в том, что прописывая android:process=":newproc" освобождаем ли мы себя от необходимости создавать поток?

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение rezak90 » 31 окт 2012, 15:14

The manifest entry for each type of component element—<activity>, <service>, <receiver>, and <provider>—supports an android:process attribute that can specify a process in which that component should run.
Это если в другом процессе. Но сервис и так работает в отдельном потоке (хотя я до конца не уверен, всегда юзаю в сервисе отдельный поток, как то таким вопросом не заморачивался).
R.id.team
Политика на форуме запрещена

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение brucemax » 31 окт 2012, 19:13

rezak90 писал(а):The manifest entry for each type of component element—<activity>, <service>, <receiver>, and <provider>—supports an android:process attribute that can specify a process in which that component should run.
Это если в другом процессе. Но сервис и так работает в отдельном потоке (хотя я до конца не уверен, всегда юзаю в сервисе отдельный поток, как то таким вопросом не заморачивался).
В этой цитате говориться, что этим атрибутом пожно просто указать процесс в котором будет выполняться компонент (активити, сервис.. ) И если другой процесс это значит другой поток, то это ответ на мой вопрос.

А насчёт "и так работает в другом потоке" (раз мы уж по цитатам пошли =)):
Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). This means that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 playback or networking), you should create a new thread within the service to do that work. By using a separate thread, you will reduce the risk of Application Not Responding (ANR) errors and the application's main thread can remain dedicated to user interaction with your activities.

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение brucemax » 02 ноя 2012, 00:14

Оказалось легче проверить самому. =) да как только прописываешь android:process=":newproc", сервис оказывается в новом потоке.

pahanez
Сообщения: 1
Зарегистрирован: 18 дек 2012, 13:19

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение pahanez » 18 дек 2012, 14:10

Привет. Есть ли возможность контролировать поведение Service после уничтожения системой в Android 1.5. Т.к. метод onStartCommand и START_NOT_STICKY появился только в 2.1 Api 5?

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

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение damager82 » 24 дек 2012, 13:53

pahanez писал(а):Привет. Есть ли возможность контролировать поведение Service после уничтожения системой в Android 1.5. Т.к. метод onStartCommand и START_NOT_STICKY появился только в 2.1 Api 5?
Думаю, нет
http://android-developers.blogspot.ru/2 ... -with.html
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Dangreon
Сообщения: 41
Зарегистрирован: 01 янв 2013, 15:52

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение Dangreon » 28 мар 2013, 20:40

У меня появилась следующая проблема..: в месте урока, где переписывается onStartCommand и ставится return START_STICKY ,
кликаю на кнопке start , запускается сервис, я его останавливаю, он возобновляется примерно через 5 секунд.
В логах все так же, как в уроке, но как только отрабатывает метод
public void onCreate() {
super.onCreate();
Log.d(LOG_TAG, "MyService onCreate");
}

возникает ошибка:

java.lang.RuntimeException: Unable to start service com.example.u94_services_service.MyService@412a93f0 with null: java.lang.NullPointerException

В чем может быть дело??

spheros
Сообщения: 11
Зарегистрирован: 29 мар 2013, 18:36

Re: Урок 94. Service. Подробно про onStartCommand

Сообщение spheros » 08 май 2013, 22:15

Dangreon писал(а):У меня появилась следующая проблема..: в месте урока, где переписывается onStartCommand и ставится return START_STICKY ,
кликаю на кнопке start , запускается сервис, я его останавливаю, он возобновляется примерно через 5 секунд.
В логах все так же, как в уроке, но как только отрабатывает метод
public void onCreate() {
super.onCreate();
Log.d(LOG_TAG, "MyService onCreate");
}

возникает ошибка:

java.lang.RuntimeException: Unable to start service com.example.u94_services_service.MyService@412a93f0 with null: java.lang.NullPointerException

В чем может быть дело??
Какая версия Android-а? Видимо это происходит, потому что в методе public int onStartCommand(Intent intent, int flags, int startId) есть ссылка на intent:

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

Log.d(LOG_TAG, "MyService onStartCommand, name = " + intent.getStringExtra("name"));
который нулевой, поскольку перед убийством процесса сервиса метод onStartCommand вернул START_STICKY, а не START_REDELIVER_INTENT. При этом onStartCommand не потерялся как описано в уроке, а вызвался с нулевым интентом. Видимо в более новых версиях Android SDK флаг START_STICKY действует по-другому.

Попробуйте заменить строку

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

return START_STICKY
на

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

return START_STICKY_COMPATIBILITY
либо убрать ссылку на нулевой intent в коде выше. По-крайней мере, мне это помогло (версия Android 4.0.3)

Ответить