Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 25 сен 2018, 10:01

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 66 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Урок 94. Service. Подробно про onStartCommand
СообщениеДобавлено: 08 июл 2012, 23:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.

В этом уроке:


- рассмотрим подробнее метод onStartCommand




Click here to read this article!

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


Последний раз редактировалось damager82 22 май 2017, 23:44, всего редактировалось 6 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 июл 2012, 16:20 

Зарегистрирован: 23 мар 2012, 14:26
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Могли бы Вы, пожалуйста, объяснить, для чего использовались знаки "&" в этом методе:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. void readFlags(int flags) {
  2.     if ((flags&START_FLAG_REDELIVERY) == START_FLAG_REDELIVERY)
  3.       Log.d(LOG_TAG, "START_FLAG_REDELIVERY");  
  4.     if ((flags&START_FLAG_RETRY) == START_FLAG_RETRY)
  5.       Log.d(LOG_TAG, "START_FLAG_RETRY");
  6.   }

Спасибо!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 июл 2012, 13:43 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Это битовые операции. Тут можно почитать об этом: http://informatics.mccme.ru/moodle/mod/book/view.php?id=578&chapterid=306

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 июл 2012, 11:57 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
у меня что то не понятки с манифестом, пишет что не может найти активити в проекте где только сервис. Как должен выглядеть манифест?

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 июл 2012, 15:25 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
У меня так:

Код: [ Загрузить ] [ Скрыть ]
Using XML Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.    package="ru.startandroid.develop.p0942servicekillserver"
  4.    android:versionCode="1"
  5.    android:versionName="1.0" >
  6.  
  7.     <uses-sdk android:minSdkVersion="10" />
  8.  
  9.     <application
  10.        android:icon="@drawable/ic_launcher"
  11.        android:label="@string/app_name" >
  12.         <service android:name="MyService">
  13.             <intent-filter>
  14.                 <action android:name="ru.startandroid.develop.p0942servicekillserver.MyService"/>
  15.             </intent-filter>
  16.         </service>
  17.     </application>
  18.  
  19. </manifest>

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 июл 2012, 11:41 

Зарегистрирован: 10 июл 2012, 10:09
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
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");


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 июл 2012, 22:19 

Зарегистрирован: 27 июл 2012, 22:11
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Всем привет. Вопрос к знающим людям:

Сделал урок под копирку, за исключением того, что и активити и сервис в одном приложении, но :

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


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

Код: [ Загрузить ] [ Скрыть ]
Using Text Syntax Highlighting
  1. MyService onCreate
  2. MyService onStartCommand, name = value
  3. START_FLAG_RETRY
  4. MyRun#1 create
  5. MyRun#1 start
  6. MyService onCreate


И все, процесс висит и ничего не происходит.
В итоге процесс просто не уничтожить, восстанавливается постоянно)
Заранее спасибо за помощь.

UPD 1

Андроид 2.33


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 июл 2012, 10:21 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Alukard писал(а):
В итоге:
- если подождать 15 секунд то все окей, за исключением того, что процесс останется висеть - это нормально?
- если кикнуть процесс, то потом он запустится, но в логах будет :

Код: [ Загрузить ] [ Скрыть ]
Using Text Syntax Highlighting
  1. MyService onCreate
  2. MyService onStartCommand, name = value
  3. START_FLAG_RETRY
  4. MyRun#1 create
  5. MyRun#1 start
  6. MyService onCreate



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

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 окт 2012, 22:10 

Зарегистрирован: 09 авг 2012, 20:58
Сообщений: 33
Откуда: Краснодар
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Всем привет!не знаю как создавать темы новых уроков! так что сорри ... вопрос такой !
Урок 94! цитирую: Прописываем сервис в манифесте и добавляем к нему IntentFilter c action = ru.startandroid.develop.p0942servicekillserver.MyService.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 окт 2012, 09:24 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Overdos писал(а):
Всем привет!не знаю как создавать темы новых уроков! так что сорри ... вопрос такой !
Урок 94! цитирую: Прописываем сервис в манифесте и добавляем к нему IntentFilter c action = ru.startandroid.develop.p0942servicekillserver.MyService.
Скажите, в каком манифесте это прописывать ??? пробывал разные варианты, ни чего не получается ((( Пожалуйста помогите.... Спасибо заранее!

Темы по урокам создаются автоматически. Ссылка в конце урока.
Про манифест было в первом уроке про сервисы - Урок 92. Если совсем не работали с манифестом - то смотрите Урок 21.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 окт 2012, 00:52 
Аватар пользователя

Зарегистрирован: 01 апр 2012, 16:09
Сообщений: 117
Откуда: Минск
Благодарил (а): 11 раз.
Поблагодарили: 5 раз.
Я правильно понимаю, если ставить атрибут android:process=":newproc", то сервис выполняется в другом потоке, и создавать runnable класс для выполнения тяжёлых задач не обязательно?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 окт 2012, 01:14 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
да, если задачи длительные то предпочтительней юзать сервисы а не потоки.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 окт 2012, 15:03 
Аватар пользователя

Зарегистрирован: 01 апр 2012, 16:09
Сообщений: 117
Откуда: Минск
Благодарил (а): 11 раз.
Поблагодарили: 5 раз.
rezak90 писал(а):
да, если задачи длительные то предпочтительней юзать сервисы а не потоки.


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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 окт 2012, 15:14 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
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
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 окт 2012, 19:13 
Аватар пользователя

Зарегистрирован: 01 апр 2012, 16:09
Сообщений: 117
Откуда: Минск
Благодарил (а): 11 раз.
Поблагодарили: 5 раз.
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.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 02 ноя 2012, 00:14 
Аватар пользователя

Зарегистрирован: 01 апр 2012, 16:09
Сообщений: 117
Откуда: Минск
Благодарил (а): 11 раз.
Поблагодарили: 5 раз.
Оказалось легче проверить самому. =) да как только прописываешь android:process=":newproc", сервис оказывается в новом потоке.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 дек 2012, 14:10 

Зарегистрирован: 18 дек 2012, 13:19
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Привет. Есть ли возможность контролировать поведение Service после уничтожения системой в Android 1.5. Т.к. метод onStartCommand и START_NOT_STICKY появился только в 2.1 Api 5?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 дек 2012, 13:53 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
pahanez писал(а):
Привет. Есть ли возможность контролировать поведение Service после уничтожения системой в Android 1.5. Т.к. метод onStartCommand и START_NOT_STICKY появился только в 2.1 Api 5?

Думаю, нет
http://android-developers.blogspot.ru/2 ... -with.html

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 мар 2013, 20:40 

Зарегистрирован: 01 янв 2013, 15:52
Сообщений: 41
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
У меня появилась следующая проблема..: в месте урока, где переписывается 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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 май 2013, 22:15 

Зарегистрирован: 29 мар 2013, 18:36
Сообщений: 11
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
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:
Код: [ Загрузить ] [ Скрыть ]
  1. Log.d(LOG_TAG, "MyService onStartCommand, name = " + intent.getStringExtra("name")); 

который нулевой, поскольку перед убийством процесса сервиса метод onStartCommand вернул START_STICKY, а не START_REDELIVER_INTENT. При этом onStartCommand не потерялся как описано в уроке, а вызвался с нулевым интентом. Видимо в более новых версиях Android SDK флаг START_STICKY действует по-другому.

Попробуйте заменить строку
Код: [ Загрузить ] [ Скрыть ]
  1. return START_STICKY 
на
Код: [ Загрузить ] [ Скрыть ]
  1. return START_STICKY_COMPATIBILITY 
либо убрать ссылку на нулевой intent в коде выше. По-крайней мере, мне это помогло (версия Android 4.0.3)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 66 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB