Google Android - это несложно • Просмотр темы - Урок 94. Service. Подробно про onStartCommand

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

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

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




Начать новую тему Ответить на тему  [ Сообщений: 66 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 28 июл 2014, 12:44 

Зарегистрирован: 25 июл 2014, 10:58
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
neoksi писал(а):
Анэрон писал(а):
Для начала большое спасибо автору за уроки очень много почерпнул. Фактически всему учился по этим урокам. Прошу совета есть сервис который переодически берёт кординаты и отправляет их на сервер. Также он передаёт данные в активность. Реализация задержки происходит обычным бесконечным циклом ну понятное дело с условием на его остановку. И задержкой slep.По факту всё работает. Но очевидно происходит утечка памяти. На реальном девайсе. И следовательно через определённое время втечении часа или получаса приложение убивается системой. Вопрос как мне отловить утечку памяти. Или как переделать сервис чтобы переодически повторял какое-либо действие. Буду очень признателен за совет.

Тебе нужно пересмотреть саму логику процесса. Держать постоянно работающий сервис в памяти, тебе не даст система.
Для выполнения время от времени какой-либо операции, нужно создавать связку из AlarmManager - > BroadcastReceiver - > Service.

Схема следующая:
1) Создаешь задачу в AlarmManager кидать броадкас через определенные промежутки времени;
2) Ловишь броадкаст и если нужно запускаешь сервис;
3) Выполняешь нужные операции в сервисе без каких-либо таймеров;
4) Освобождаешь ресурсы.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 окт 2014, 02:42 

Зарегистрирован: 21 сен 2014, 23:06
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Та же проблема, что и у olademar. "Подскажите, пожалуйста, почему система не видит флаги: START_FLAG_RETRY или START_FLAG_REDELIVERY и константы: START_NOT_STICKY, START_STICKY, START_REDELIVER_INTENT, т.е. лог с выводом флагов в методе readFlag() отсутствует. Если процесс убить при любой возвращаемой константе в методе onStartCommand, процесс не оживает". Уже и перепечатывал код, и просто копировал. Результат один и тот же.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 ноя 2014, 12:44 
Аватар пользователя

Зарегистрирован: 18 ноя 2014, 11:22
Сообщений: 10
Благодарил (а): 6 раз.
Поблагодарили: 0 раз.
Здравствуйте.

Aleator писал(а):
Та же проблема, что и у olademar. ... Если процесс убить при любой возвращаемой константе в методе onStartCommand, процесс не оживает"...


У меня похожая ситуация:
1) Если сервис не убивать, он выполняет свою задачу, но остается висеть в списке процессов.
2) Если сервис убить, он не оживает.
Версия SDK:
Код: [ Загрузить ] [ Скрыть ]
  1.     <uses-sdk 
  2.             android:minSdkVersion="19" 
  3.             android:targetSdkVersion="19"/> 

_________________
Каждая незаконченная задача - это минус. Но каждый зачеркнутый минус - это плюс.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 янв 2015, 22:05 

Зарегистрирован: 04 ноя 2014, 22:23
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Все уроки до этого прошел, а с этим уже больше недели мучаюсь над этим уроком. При нажатии на кнопку система ругается. Помогите кто нибудь. Пожалуйста.
Логи
01-25 18:56:15.195: E/AndroidRuntime(3572): FATAL EXCEPTION: main
01-25 18:56:15.195: E/AndroidRuntime(3572): java.lang.RuntimeException: Unable to instantiate service ru.servicekillserver.MyService: java.lang.ClassNotFoundException: Didn't find class "ru.servicekillserver.MyService" on path: /data/app/ru.servicekillserver-2.apk


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

Зарегистрирован: 23 ноя 2013, 16:08
Сообщений: 1107
Откуда: Ukraine
Благодарил (а): 31 раз.
Поблагодарили: 175 раз.
класс MyService точно существует?

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 янв 2015, 23:46 

Зарегистрирован: 04 ноя 2014, 22:23
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
doter.ua писал(а):
класс MyService точно существует?

Да, существует. Но меня смущает что когда редактируешь Манифест и заполняешь Name это сервиса (выбираю из того что предлагает), то горит маленький красный крестик. Но раз он предлагает, значит он его видит, этот класс MyService.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 янв 2015, 23:49 

Зарегистрирован: 04 ноя 2014, 22:23
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
doter.ua писал(а):
класс MyService точно существует?

Ты имеешь ввиду Android Studio?
Если да, то может подскажешь уроки под него, чтобы разобраться. Я его поставил, но все уроки, которые здесь, даже на Eclips тяжело. Боюсь совсем утонуть.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 фев 2015, 16:59 

Зарегистрирован: 24 фев 2015, 16:44
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Добрый вечер! Не удается выполнить урок, приложение закрывается с ошибкой:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.admin.servicekillserver_94.MyService (has extras) }
  2. at com.example.admin.servicekillclient_94.MainActivity.onClickStart(MainActivity.java:20)


ServiceKillClient Activity:

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class MainActivity extends Activity {
  2.  
  3.     @Override
  4.     public void onCreate(Bundle savedInstanceState) {
  5.         super.onCreate(savedInstanceState);
  6.         setContentView(R.layout.activity_main);
  7.     }
  8.  
  9.     public void onClickStart(View view) {
  10.         startService(new Intent("com.example.admin.servicekillserver_94.MyService")
  11.                .putExtra("name", "value"));
  12.     }
  13. }


ServiceKillServer MyService:

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class MyService extends Service {
  2.  
  3.     final String LOG="myLogs";
  4.  
  5.     @Override
  6.     public void onCreate() {
  7.         super.onCreate();
  8.         Log.d(LOG,"MyService onCreate");
  9.     }
  10.  
  11.     @Override
  12.     public void onDestroy() {
  13.         super.onDestroy();
  14.         Log.d(LOG,"MyService onDestroy");
  15.     }
  16.  
  17.     @Override
  18.     public int onStartCommand(Intent intent, int flags, int startId) {
  19.         Log.d(LOG,"MyService onStartCommand");
  20.         readFlags(flags);
  21.         MyRun mr=new MyRun(startId);
  22.         new Thread(mr).start();
  23.         return START_NOT_STICKY;
  24.     }
  25.  
  26.     void readFlags(int flags) {
  27.         if ((flags&START_FLAG_REDELIVERY)==START_FLAG_REDELIVERY)
  28.             Log.d(LOG,"START_FLAG_REDELIVERY");
  29.         if ((flags&START_FLAG_RETRY)==START_FLAG_RETRY)
  30.             Log.d(LOG,"START_FLAG_RETRY");
  31.     }
  32.  
  33.     @Override
  34.     public IBinder onBind(Intent intent) {
  35.         return null;
  36.     }
  37.  
  38.     class MyRun implements Runnable {
  39.  
  40.         int startId;
  41.  
  42.         public MyRun(int startId) {
  43.             this.startId=startId;
  44.             Log.d(LOG,"MyRun#"+startId+" create");
  45.         }
  46.  
  47.         @Override
  48.         public void run() {
  49.             Log.d(LOG,"MyRun#"+startId+" start");
  50.             try {
  51.                 TimeUnit.SECONDS.sleep(15);
  52.             } catch (InterruptedException e) {
  53.                 e.printStackTrace();
  54.             }
  55.             stop();
  56.         }
  57.  
  58.         void stop() {
  59.             Log.d(LOG,"MyRun#"+startId+" end, stopSelfResult("+startId+") = "
  60.             +stopSelfResult(startId));
  61.         }
  62.     }
  63. }


ServiceKillServer Manifest:

Код: [ Загрузить ] [ Скрыть ]
Using XML Syntax Highlighting
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2.          package="com.example.admin.servicekillserver_94">
  3.  
  4.     <application android:allowBackup="true"
  5.                 android:label="@string/app_name"
  6.                 android:icon="@mipmap/ic_launcher"
  7.                 android:theme="@style/AppTheme">
  8.         <service android:name=".MyService">
  9.             <intent-filter>
  10.                 <action android:name="com.example.admin.servicekillserver_94.MyService"/>
  11.                 <category android:name="android.intent.category.DEFAULT"/>
  12.             </intent-filter>
  13.         </service>
  14.  
  15.     </application>
  16.  
  17.  
  18. </manifest>


В общем все как в уроке. Буду признателен за помощь!

UPD Создал класс сервиса в одном проекте с активити, сервис в отдельном процессе, все работает. может в манифесте активити надо было добавить какие-либо permissions?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 16 апр 2015, 15:56 

Зарегистрирован: 31 мар 2015, 15:17
Сообщений: 15
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
Урок падает в Android Studio с ошибкой. Что именно нужно изменить что бы работал? На сколько я понял - сервис без активити не запускается.

-----

На AVD 5.0+ валится с ошибкой. Попробовал запустить на 4.4 - приложение уже не вылает, но выдает "Implicit intents with startService are not safe: Intent { act=ru.startandroid.develop.p0942servicekillserver.MyService (has extras) } android.content.ContextWrapper.startService:494 com.example.pavel.ololosh.MainActivity.onClickStart:19 java.lang.reflect.Method.invokeNative:-2"

------
У всех у кого валиться с такой же ошибкой - неявный вызов сервиса не работает в Android 5.0+. Работайте с АПИ ниже и все будет ок.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 май 2015, 23:00 

Зарегистрирован: 14 мар 2015, 19:56
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Как убивать процессы в Android Studio? В качестве эмулятора использую Genymotion


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

Зарегистрирован: 17 июл 2015, 14:17
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
mitra писал(а):
Здравствуйте.

Aleator писал(а):
Та же проблема, что и у olademar. ... Если процесс убить при любой возвращаемой константе в методе onStartCommand, процесс не оживает"...


У меня похожая ситуация:
1) Если сервис не убивать, он выполняет свою задачу, но остается висеть в списке процессов.
2) Если сервис убить, он не оживает.
Версия SDK:
Код: [ Загрузить ] [ Скрыть ]
  1.     <uses-sdk 
  2.             android:minSdkVersion="19" 
  3.             android:targetSdkVersion="19"/> 


Аналогично. Сервис выполняет работу и висит в списке. Если остановить, он не оживает. Пишу под API 17.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 авг 2015, 12:18 

Зарегистрирован: 28 июн 2015, 03:13
Сообщений: 36
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Доброго всем дня!
Видимо с момента написания урка многое изменилось. Попробуйте переписать readFlags (просто чтобы было понятней):
Код: [ Загрузить ] [ Скрыть ]
  1. void readFlags(int flags) { 
  2.         if(flags==1) Log.d(LOG_TAG, "START_FLAG_REDELIVERY"); 
  3.         if(flags==2) Log.d(LOG_TAG, "START_FLAG_RETRY"); 
  4.         if(flags==0) Log.d(LOG_TAG, "000000"); 
  5.         Log.d(LOG_TAG, "Anyway:" + flags); 
  6.     } 


И вы увидите, что всё время будет приходить 0 во флагах.
А вот в уроке сказано: "На практике я ни разу не встречал значения 0".
Видимо разработчики это пофиксили.

Однако, START_FLAG_RETRY за весь урок у меня так и не появился.
Цитата:
08-04 08:49:39.506 2212-2212/? D/myLogs﹕ MyService onCreate
08-04 08:49:39.506 2212-2212/? D/myLogs﹕ MyService onStartCommand, name = value
08-04 08:49:39.506 2212-2212/? D/myLogs﹕ 000000
08-04 08:49:39.506 2212-2212/? D/myLogs﹕ Anyway:0
08-04 08:49:39.506 2212-2212/? D/myLogs﹕ MyRun#1 create
08-04 08:49:39.506 2212-2226/? D/myLogs﹕ MyRun#1 start
08-04 08:49:54.617 2229-2229/? D/myLogs﹕ MyService onCreate
08-04 08:49:54.617 2229-2229/? D/myLogs﹕ MyService onStartCommand, name = value
08-04 08:49:54.617 2229-2229/? D/myLogs﹕ START_FLAG_REDELIVERY
08-04 08:49:54.617 2229-2229/? D/myLogs﹕ Anyway:1
08-04 08:49:54.617 2229-2229/? D/myLogs﹕ MyRun#1 create
08-04 08:49:54.617 2229-2242/? D/myLogs﹕ MyRun#1 start
08-04 08:50:09.627 2229-2229/? D/myLogs﹕ MyService onDestroy
08-04 08:50:09.627 2229-2242/? D/myLogs﹕ MyRun#1 end, stopSelfResult(1) = true


Примечательно, что после отработки методов onDestroy и stopSelfResult
сервис P0942_ServiceKillServer так и остался висеть в Device Monitor.
Но после второй попытки остановить его (естественно 15 сек уже прошло) он стерся из процессов. => Делайте контрольный выстрел)), на всякий случай.

Остался один вопрос:
В AVD выше 17 версии сервис так и не запустился.
Можно ли всё таки запускать сервисы без активити в наши дни? (в новых версиях Android)
Или теперь просто сервис без активити не напишешь?
Может быть я чего-то не до-понимаю. Поправьте если что.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2015, 13:06 
Аватар пользователя

Зарегистрирован: 09 сен 2015, 13:53
Сообщений: 19
Благодарил (а): 1 раз.
Поблагодарили: 5 раз.
K_Vladimir писал(а):
Остался один вопрос:
В AVD выше 17 версии сервис так и не запустился.
Можно ли всё таки запускать сервисы без активити в наши дни? (в новых версиях Android)
Или теперь просто сервис без активити не напишешь?
Может быть я чего-то не до-понимаю. Поправьте если что.


Pavel-Pugach писал(а):
На AVD 5.0+ валится с ошибкой. Попробовал запустить на 4.4 - приложение уже не вылает, но выдает "Implicit intents with startService are not safe: Intent { act=ru.startandroid.develop.p0942servicekillserver.MyService (has extras) } android.content.ContextWrapper.startService:494 com.example.pavel.ololosh.MainActivity.onClickStart:19 java.lang.reflect.Method.invokeNative:-2"
У всех у кого валиться с такой же ошибкой - неявный вызов сервиса не работает в Android 5.0+. Работайте с АПИ ниже и все будет ок.


haos111 писал(а):
Добрый вечер! Не удается выполнить урок, приложение закрывается с ошибкой:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.admin.servicekillserver_94.MyService (has extras) }
  2. at com.example.admin.servicekillclient_94.MainActivity.onClickStart(MainActivity.java:20)


UPD Создал класс сервиса в одном проекте с активити, сервис в отдельном процессе, все работает. может в манифесте активити надо было добавить какие-либо permissions?



:!: Обратите внимание:
В данном уроке используется implicit (неявный) intent. После API 19 это запрещено что и вызывает java.lang.IllegalArgumentException: Service Intent must be explicit

Проблема и решение описаны здесь: http://stackoverflow.com/questions/2653 ... 2#28151732

Если коротко, то рекомендуется: использовать явные интенты или в интент прописать имя пакета myIntent.setPackage("com.package.with.service");
это пофиксит проблему.


Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1. MainActivity.java
  2. ...
  3.  
  4. Intent serviceIntent = new Intent("ru.startandroid.develop.p0942servicekillserver.MyService")
  5.                                  .putExtra("name", "my_super_value");
  6.  
  7. serviceIntent.setPackage("ru.startandroid.develop.p0942servicekillserver");
  8. startService(serviceIntent);
  9.  


более грамотная реализация описана здесь: http://blog.android-develop.com/2014/10 ... gumen.html но смысл тот же.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2015, 17:15 
Аватар пользователя

Зарегистрирован: 09 сен 2015, 13:53
Сообщений: 19
Благодарил (а): 1 раз.
Поблагодарили: 5 раз.
damager82 писал(а):
В этом уроке:

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

Click here to read this article!


спасибо за интересный урок. Чтобы привести его в актуальное состояние хорошо бы его обновить и перезаписать. Пожелания:

1. внести в урок описание ошибки из-за implicit intent и способ ее устранения

2. поменять в методе readFlags() способ с битовым максами на всем понятный switch()
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1.     private void readFlags(int flags) {
  2.         switch (flags) {
  3.             case START_FLAG_REDELIVERY:
  4.                 Log.d(LOG_TAG, "readFlags: START_FLAG_REDELIVERY");
  5.                 break;
  6.             case START_FLAG_RETRY:
  7.                 Log.d(LOG_TAG, "readFlags: START_FLAG_RETRY");
  8.                 break;
  9.             case 0:
  10.                 Log.d(LOG_TAG, "readFlags: 0");
  11.                 break;
  12.             default:
  13.                 Log.d(LOG_TAG, "readFlags: ERROR. Unexpected flag returned: " + flags);
  14.         }
  15.     }


3. Флаги это самое интересное, давайте разбираться:

в первом случае когда:
в оnStartCommand() возвращаем return START_NOT_STICKY; - наш метод readFlags() покажет 0 , и это логично т.к. это первый запуск (а не START_FLAG_RETRY как в уроке)

во втором случае в уроке мы делаем следующее:
строчку лога изменяем и дописываем обращение к интенту:
Log.d(LOG_TAG, "MyService onStartCommand, name = " + intent.getStringExtra("name"));
возвращаемую константу при этом делаем START_STICKY.

вот здесь присутствует ошибка NullPointerException которую почему-то никто не заметил.
логи:
MyRun#1 create
MyRun#1 start
MyService onCreate
MyService onCreate

вопрос: куда делся вызов метода onStartCommand() который должен оставить в логах сообщение "MyService onStartCommand, name = " + intent.getStringExtra("name")) ?
его нет, так как при перезапуске сервиса с константой START_STICKY после onCreate() вызывается метод onStartCommand() с аргументом Intent == null,
соответственно нельзя на null'е вызывать .getStringExtra("name"). Вылетает ошибка и комманда вывода лога не отрабатывается.
В комментариях прозвучало "Но вызов startService, который он получил в прошлый раз, потерян." - он не потерян, он есть, просто интент пришел null и мы его не увидели.

теперь о START_FLAG_RETRY:
Все таки пытаемся его отловить: убираем обращение к пустому интенту, все перезапускаем, останавливаем сервис и получаем еще одну странную вещь:
в логах видно что при повторном вызове onStartCommand флаг приходит все равно нулевой - 0. (а мы ожидаем START_FLAG_RETRY)
Лог:
Код: [ Загрузить ] [ Скрыть ]
  1. 09-22 17:03:58.278    6240-6240/? D/myLogs﹕ ____________________ 
  2. 09-22 17:03:58.278    6240-6240/? D/myLogs﹕ MyService.onCreate() 
  3. 09-22 17:03:58.278    6240-6240/? D/myLogs﹕ MyService.onStartCommand() 
  4. 09-22 17:03:58.278    6240-6240/? D/myLogs﹕ readFlags: 0 
  5. 09-22 17:03:58.278    6240-6240/? D/myLogs﹕ MyRun#1 was created in constructor 
  6. 09-22 17:03:58.279    6240-6262/? D/myLogs﹕ MyRun#1 started 
  7. 09-22 17:04:05.371    6543-6543/? D/myLogs﹕ ____________________ 
  8. 09-22 17:04:05.371    6543-6543/? D/myLogs﹕ MyService.onCreate() 
  9. 09-22 17:04:05.372    6543-6543/? D/myLogs﹕ MyService.onStartCommand() 
  10. 09-22 17:04:05.372    6543-6543/? D/myLogs﹕ readFlags: 0 
  11. 09-22 17:04:05.372    6543-6543/? D/myLogs﹕ MyRun#2 was created in constructor 
  12. 09-22 17:04:05.373    6543-6589/? D/myLogs﹕ MyRun#2 started 
  13. 09-22 17:04:14.097    6726-6726/? D/myLogs﹕ ____________________ 
  14. 09-22 17:04:14.097    6726-6726/? D/myLogs﹕ MyService.onCreate() 
  15. 09-22 17:04:14.098    6726-6726/? D/myLogs﹕ MyService.onStartCommand() 
  16. 09-22 17:04:14.098    6726-6726/? D/myLogs﹕ readFlags: 0 
  17. 09-22 17:04:14.099    6726-6726/? D/myLogs﹕ MyRun#3 was created in constructor 
  18. 09-22 17:04:14.100    6726-6758/? D/myLogs﹕ MyRun#3 started 

почему? это не баг, читаем доки: public static final int START_FLAG_RETRY - This flag is set in onStartCommand(Intent, int, int) if the Intent is a retry because the original attempt never got to or returned from onStartCommand(Intent, int, int).

Это значит что флаг START_FLAG_RETRY мы получим только в том случае, если метод onStartCommand() или вовсе не вызовится или в самом методе onStartCommand() до return процесс упадет. То есть, это тот крошечный момент, между стартом onCreate() и концом метода onStartCommand(). В ручную чтобы подловить его надо вставлять sleep или использовать System.exit(1) что на уровне системы вырубает процесс.
Вот тогда в логах увидим START_FLAG_RETRY.

получился такой лог:
Код: [ Загрузить ] [ Скрыть ]
  1. 09-22 16:48:15.998  21135-21135/? D/myLogs﹕ ____________________ 
  2. 09-22 16:48:15.998  21135-21135/? D/myLogs﹕ MyService.onCreate() 
  3. 09-22 16:48:15.999  21135-21135/? D/myLogs﹕ MyService.onStartCommand() 
  4. 09-22 16:48:15.999  21135-21135/? D/myLogs﹕ readFlags: 0 
  5. 09-22 16:48:16.000  21135-21135/? D/myLogs﹕ MyRun#1 was created in constructor 
  6. 09-22 16:48:16.001  21135-21160/? D/myLogs﹕ MyRun#1 started 
  7. 09-22 16:48:35.109  21449-21449/? D/myLogs﹕ ____________________ 
  8. 09-22 16:48:35.109  21449-21449/? D/myLogs﹕ MyService.onCreate() 
  9. 09-22 16:48:35.109  21449-21449/? D/myLogs﹕ MyService.onStartCommand() 
  10. 09-22 16:48:35.109  21449-21449/? D/myLogs﹕ readFlags: START_FLAG_RETRY 
  11. 09-22 16:48:35.110  21449-21449/? D/myLogs﹕ MyRun#1 was created in constructor 
  12. 09-22 16:48:35.111  21449-21483/? D/myLogs﹕ MyRun#1 started 
  13. 09-22 16:49:33.182  22355-22355/? D/myLogs﹕ ____________________ 
  14. 09-22 16:49:33.182  22355-22355/? D/myLogs﹕ MyService.onCreate() 
  15. 09-22 16:49:33.183  22355-22355/? D/myLogs﹕ MyService.onStartCommand() 
  16. 09-22 16:49:33.183  22355-22355/? D/myLogs﹕ readFlags: START_FLAG_RETRY 
  17. 09-22 16:49:33.184  22355-22355/? D/myLogs﹕ MyRun#1 was created in constructor 
  18. 09-22 16:49:33.186  22355-22375/? D/myLogs﹕ MyRun#1 started 


интересно, что если убивать процесс в методе onStartCommand() до return то система сделает только две попытки и больше не будет пробовать. Почему? Наверно потому что используется в этих попытках один и тот же startId. и видимо когда он дважды повторяется с константой флагом START_FLAG_RETRY система понимает что это вечный цикл.
В то же время если останавливать процесс как мы до этого делали (после выполнения onStartCommand()) и получали флаг = 0 (см. логи выше) то система каждую попытку дает аргументом в onStartCommand() каждый раз новый startId и "надеется" что на этот раз selfStop() отработает )))



хорошая статьи для закрепления: http://developer.alexanderklimov.ru/and ... theory.php
схема жизненного цикла перезапуска сервиса: http://programador.ru/sticky-service/


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 ноя 2015, 00:41 

Зарегистрирован: 19 окт 2014, 16:52
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Есть неприятный момент.

Если возвращаем START_STICKY - сервис перезапускается при многократных закрытиях-открытиях приложения, и вроде как постоянно. И это хорошо. ;)

НО !
Если возвращаем START_REDELIVER_INTENT :
сервис перезапускается пять раз, на шестой - сервис не перезапускается и это беда ... :((((

К сожалению нужен постоянно работающий сервис, и не нулевой интент. Кто то знает как с сим боротся?


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

Зарегистрирован: 04 дек 2015, 14:53
Сообщений: 5
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Процесс после остановки не оживает хотя START_REDELIVER_INTENT. почему это может быть?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 дек 2015, 21:40 

Зарегистрирован: 30 дек 2015, 21:32
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
У меня такая же проблема с флагами возвращает 0, и при убивании процесса сервиса он не восстанавливается. Помогите,пожалуйста,мучаюсь 2 дня уже. Сервис не вос
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. package com.example.les94;
  2.  
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.os.IBinder;
  6. import android.util.Log;
  7.  
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. public class MyService extends Service {
  11.     final String LOG_TAG = "myLogs";
  12.  
  13.     public void onCreate() {
  14.         super.onCreate();
  15.         Log.d(LOG_TAG, "MyService onCreate");
  16.     }
  17.  
  18.     public void onDestroy() {
  19.         super.onDestroy();
  20.         Log.d(LOG_TAG, "MyService onDestroy");
  21.     }
  22.  
  23.     public int onStartCommand(Intent intent, int flags, int startId) {
  24.         Log.d(LOG_TAG, "MyService onStartCommand,name = "+intent.getStringExtra("name"));
  25.         readFlags(flags);
  26.         MyRun mr = new MyRun(startId);
  27.         new Thread(mr).start();
  28.         return START_STICKY;
  29.     }
  30.  
  31.     public IBinder onBind(Intent arg0) {
  32.         return null;
  33.     }
  34.  
  35.     void readFlags(int flags) {
  36.         switch (flags) {
  37.             case START_FLAG_REDELIVERY:
  38.                 Log.d(LOG_TAG, "START_FLAG_REDELIVERY");
  39.                 break;
  40.             case START_FLAG_RETRY:
  41.                 Log.d(LOG_TAG, "START_FLAG_RETRY");
  42.                 break;
  43.             case 0:
  44.                 Log.d(LOG_TAG, "0");
  45.                 break;
  46.             default:
  47.                 Log.d(LOG_TAG, "readFlags: ERROR. Unexpected flag returned: " + flags);
  48.         }
  49.     }
  50.  
  51.     class MyRun implements Runnable {
  52.  
  53.         int startId;
  54.  
  55.         public MyRun(int startId) {
  56.             this.startId = startId;
  57.             Log.d(LOG_TAG, "MyRun#" + startId + " create");
  58.         }
  59.  
  60.         public void run() {
  61.             Log.d(LOG_TAG, "MyRun#" + startId + " start");
  62.             try {
  63.                 TimeUnit.SECONDS.sleep(15);
  64.             } catch (InterruptedException e) {
  65.                 e.printStackTrace();
  66.             }
  67.             stop();
  68.         }
  69.  
  70.         void stop() {
  71.             Log.d(LOG_TAG, "MyRun#" + startId + " end, stopSelfResult("
  72.                     + startId + ") = " + stopSelfResult(startId));
  73.         }
  74.     }
  75. }
  76.  


А вот манифест
Код: [ Загрузить ] [ Скрыть ]
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="com.example.les94" >
  4.    
  5.     <application
  6.        android:allowBackup="true"
  7.        android:icon="@mipmap/ic_launcher"
  8.        android:label="@string/app_name"
  9.        android:supportsRtl="true"
  10.        android:theme="@style/AppTheme" >
  11.         <activity android:name=".MainActivity" >
  12.             <intent-filter>
  13.                 <action android:name="android.intent.action.MAIN" />
  14.  
  15.                 <category android:name="android.intent.category.LAUNCHER" />
  16.             </intent-filter>
  17.         </activity>
  18.  
  19.         <service
  20.            android:name=".MyService"
  21.            android:enabled="true"
  22.            android:exported="true"
  23.            android:process=":myService">
  24.  
  25.             <intent-filter>
  26.                 <action android:name="com.example.les94.MyService"/>
  27.             </intent-filter>
  28.         </service>
  29.     </application>
  30.  
  31. </manifest>
  32.  


А вот лог:
12-30 21:39:24.289 22045-22045/? D/myLogs: MyService onCreate
12-30 21:39:24.290 22045-22045/? D/myLogs: MyService onStartCommand,name = value
12-30 21:39:24.290 22045-22045/? D/myLogs: 0
12-30 21:39:24.291 22045-22045/? D/myLogs: MyRun#1 create
12-30 21:39:24.293 22045-22058/? D/myLogs: MyRun#1 start
12-30 21:39:25.012 22045-22045/? D/myLogs: MyService onStartCommand,name = value
12-30 21:39:25.013 22045-22045/? D/myLogs: 0
12-30 21:39:25.013 22045-22045/? D/myLogs: MyRun#2 create
12-30 21:39:25.019 22045-22059/? D/myLogs: MyRun#2 start
12-30 21:39:39.294 22045-22058/? D/myLogs: MyRun#1 end, stopSelfResult(1) = false
12-30 21:39:40.021 22045-22045/? D/myLogs: MyService onDestroy
12-30 21:39:40.024 22045-22059/? D/myLogs: MyRun#2 end, stopSelfResult(2) = true

То есть метод onStartCommand всегда выдает флаг 0


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 апр 2016, 15:46 

Зарегистрирован: 09 апр 2016, 15:40
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Имеется служба, которая запускается при старте системы. В параметрах onStartCommand установлен флаг START_Sticky . Служба перезапускается, как и должно, если её убить в Device Monitor и если она была запущена через активити. Но если служба стартует вместе с системой, автовосстановление не работает. Где нужно прописать флаг START_STICKY чтобы все работало как надо?


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

Зарегистрирован: 26 дек 2012, 23:32
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Цитата :"В хелпе написано, что flags может принимать значения 0, START_FLAG_RETRY или START_FLAG_REDELIVERY.
Написал небольшую программку с запуском сервиса - flags всегда равен 0, даже если при работающем сервисе принудительно выпоняю команду onStartCommand - flags все равно равен 0
Кто что может подсказать


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 июл 2016, 12:28 

Зарегистрирован: 08 июл 2016, 12:26
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
rezak90 писал(а):
у меня что то не понятки с манифестом, пишет что не может найти активити в проекте где только сервис. Как должен выглядеть манифест?

таже проблема (Could not identify launch activity: Default Activity not found
Error while Launching activity) в AndroidStudio, класс находится в правильном пакете, какие еще есть решения?
и кто знает как посмотреть запущенные сервисы на genimotion из под AndroidStudio?


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

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


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

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