Урок 94. Service. Подробно про onStartCommand
Урок 94. Service. Подробно про onStartCommand
В этом уроке:
- рассмотрим подробнее метод onStartCommand
Click here to read this article!
- рассмотрим подробнее метод onStartCommand
Click here to read this article!
Последний раз редактировалось damager82 22 май 2017, 23:44, всего редактировалось 6 раз.
Re: Урок 94. Service. Подробно про onStartCommand
Могли бы Вы, пожалуйста, объяснить, для чего использовались знаки "&" в этом методе:
Спасибо!
Код: Выделить всё
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
Это битовые операции. Тут можно почитать об этом: http://informatics.mccme.ru/moodle/mod/ ... pterid=306
Если flags содержит флаг START_FLAG_REDELIVERY, то эта операция flags&START_FLAG_REDELIVERY вернет именно этот флаг. При этом flags может содержать еще кучу других флагов.
Если flags содержит флаг START_FLAG_REDELIVERY, то эта операция flags&START_FLAG_REDELIVERY вернет именно этот флаг. При этом flags может содержать еще кучу других флагов.
Re: Урок 94. Service. Подробно про onStartCommand
у меня что то не понятки с манифестом, пишет что не может найти активити в проекте где только сервис. Как должен выглядеть манифест?
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 94. Service. Подробно про onStartCommand
У меня так:
Код: Выделить всё
<?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
Была таже проблема в итоге решение оказалось в packages в папке src, я добавил класс MyServer в пустой деволтный пакет: (default package), а путь в то время как он должен был находиться в - com.example.p0942_servicekillserver (у Вас возможно по другому). Обычный перенос класса MyService в правильный пакет решил все вопросы =)rezak90 писал(а):у меня что то не понятки с манифестом, пишет что не может найти активити в проекте где только сервис. Как должен выглядеть манифест?
У меня вот другой прикол 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
Всем привет. Вопрос к знающим людям:
Сделал урок под копирку, за исключением того, что и активити и сервис в одном приложении, но :
- если подождать 15 секунд то все окей, за исключением того, что процесс останется висеть - это нормально?
- если кикнуть процесс, то потом он запустится, но в логах будет :
И все, процесс висит и ничего не происходит.
В итоге процесс просто не уничтожить, восстанавливается постоянно)
Заранее спасибо за помощь.
UPD 1
Андроид 2.33
Сделал урок под копирку, за исключением того, что и активити и сервис в одном приложении, но :
В итоге:Я раскидал сервис и приложение по разным проектам для большей наглядности. А вообще, организовать работу сервиса и приложения в разных процессах можно было и в одном проекте (в одном 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
То, что висит процесс - я думаю, это нормально. Скорее всего сейчас системе не нужны ресурсы и она не убивает процесс.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, как содер
Всем привет!не знаю как создавать темы новых уроков! так что сорри ... вопрос такой !
Урок 94! цитирую: Прописываем сервис в манифесте и добавляем к нему IntentFilter c action = ru.startandroid.develop.p0942servicekillserver.MyService.
Скажите, в каком манифесте это прописывать ??? пробывал разные варианты, ни чего не получается ((( Пожалуйста помогите.... Спасибо заранее!
Урок 94! цитирую: Прописываем сервис в манифесте и добавляем к нему IntentFilter c action = ru.startandroid.develop.p0942servicekillserver.MyService.
Скажите, в каком манифесте это прописывать ??? пробывал разные варианты, ни чего не получается ((( Пожалуйста помогите.... Спасибо заранее!
Re: Урок 77. Tab - вкладки. TabActivity. Activity, как содер
Темы по урокам создаются автоматически. Ссылка в конце урока.Overdos писал(а):Всем привет!не знаю как создавать темы новых уроков! так что сорри ... вопрос такой !
Урок 94! цитирую: Прописываем сервис в манифесте и добавляем к нему IntentFilter c action = ru.startandroid.develop.p0942servicekillserver.MyService.
Скажите, в каком манифесте это прописывать ??? пробывал разные варианты, ни чего не получается ((( Пожалуйста помогите.... Спасибо заранее!
Про манифест было в первом уроке про сервисы - Урок 92. Если совсем не работали с манифестом - то смотрите Урок 21.
Re: Урок 94. Service. Подробно про onStartCommand
Я правильно понимаю, если ставить атрибут android:process=":newproc", то сервис выполняется в другом потоке, и создавать runnable класс для выполнения тяжёлых задач не обязательно?
Re: Урок 94. Service. Подробно про onStartCommand
да, если задачи длительные то предпочтительней юзать сервисы а не потоки.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 94. Service. Подробно про onStartCommand
Эм.. ? То ли я не всё понимаю, толи вы сформулировали неправильно. Я спрашивал к тому, что по умолчанию сервис выполняется в том же потоке что и создавшее его приложение. И чтобы не "зависало" ui из-за него, в сервисе создают новый поток и выполняют задачи там (как в уроках). Вот и вопрос в том, что прописывая android:process=":newproc" освобождаем ли мы себя от необходимости создавать поток?rezak90 писал(а):да, если задачи длительные то предпочтительней юзать сервисы а не потоки.
Re: Урок 94. Service. Подробно про onStartCommand
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
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 94. Service. Подробно про onStartCommand
В этой цитате говориться, что этим атрибутом пожно просто указать процесс в котором будет выполняться компонент (активити, сервис.. ) И если другой процесс это значит другой поток, то это ответ на мой вопрос.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
Оказалось легче проверить самому. =) да как только прописываешь android:process=":newproc", сервис оказывается в новом потоке.
Re: Урок 94. Service. Подробно про onStartCommand
Привет. Есть ли возможность контролировать поведение Service после уничтожения системой в Android 1.5. Т.к. метод onStartCommand и START_NOT_STICKY появился только в 2.1 Api 5?
Re: Урок 94. Service. Подробно про onStartCommand
Думаю, нет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
У меня появилась следующая проблема..: в месте урока, где переписывается 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
В чем может быть дело??
кликаю на кнопке 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
Какая версия Android-а? Видимо это происходит, потому что в методе public int onStartCommand(Intent intent, int flags, int startId) есть ссылка на intent: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
В чем может быть дело??
Код: Выделить всё
Log.d(LOG_TAG, "MyService onStartCommand, name = " + intent.getStringExtra("name"));
Попробуйте заменить строку
Код: Выделить всё
return START_STICKY
Код: Выделить всё
return START_STICKY_COMPATIBILITY