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

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

Добавлено: 08 июл 2012, 23:00
damager82
В этом уроке:
- рассмотрим подробнее метод onStartCommand


Click here to read this article!

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

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

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

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");
  }
Спасибо!

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

Добавлено: 11 июл 2012, 13:43
damager82
Это битовые операции. Тут можно почитать об этом: http://informatics.mccme.ru/moodle/mod/ ... pterid=306

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

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

Добавлено: 23 июл 2012, 11:57
rezak90
у меня что то не понятки с манифестом, пишет что не может найти активити в проекте где только сервис. Как должен выглядеть манифест?

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

Добавлено: 23 июл 2012, 15:25
damager82
У меня так:

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

<?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>

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

Добавлено: 27 июл 2012, 11:41
htk
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");

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

Добавлено: 27 июл 2012, 22:19
Alukard
Всем привет. Вопрос к знающим людям:

Сделал урок под копирку, за исключением того, что и активити и сервис в одном приложении, но :
Я раскидал сервис и приложение по разным проектам для большей наглядности. А вообще, организовать работу сервиса и приложения в разных процессах можно было и в одном проекте (в одном 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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 31 окт 2012, 01:14
rezak90
да, если задачи длительные то предпочтительней юзать сервисы а не потоки.

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

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

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

Добавлено: 31 окт 2012, 15:14
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.
Это если в другом процессе. Но сервис и так работает в отдельном потоке (хотя я до конца не уверен, всегда юзаю в сервисе отдельный поток, как то таким вопросом не заморачивался).

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

Добавлено: 31 окт 2012, 19:13
brucemax
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.

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

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

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

Добавлено: 18 дек 2012, 14:10
pahanez
Привет. Есть ли возможность контролировать поведение Service после уничтожения системой в Android 1.5. Т.к. метод onStartCommand и START_NOT_STICKY появился только в 2.1 Api 5?

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

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

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

Добавлено: 28 мар 2013, 20:40
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

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

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

Добавлено: 08 май 2013, 22:15
spheros
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)