| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Android > Не запускается сервис в режиме ожидания |
| Автор: McBlob 14.2.2012, 16:59 |
| Написал приложение с сервисом. Сервис работает нормально. Если таск киллером убить приложения, с ними вместе убивается и сервис, но через несколько секунд запускается заново системой. Проблема в том, что если сразу после "убийства" перевести в режим ожидания (экран выключен), то сервис запустится только когда телефон перейдёт обратно в активный режим. |
| Автор: PiyodaiSiyo 19.2.2012, 08:49 |
| а если просто из экземпляра Activity звать someSrvc.stopService() в егошнем onStop()? да и экран можно оставлять вкл. после вызова super.onCreate(). звать getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) [а если звонок-смс там же запускать в onResume() someSrvc.startService()] |
| Автор: McBlob 19.2.2012, 09:22 |
| Наверное не совсем правильно вопрос задал. Если пользователь убивает службу, например таск киллером, то через некоторое время система эту службу автоматически перезапустит. Проблема в том, что если убить службу и сразу выключить экран телефона, то система запустит службу только после того как экран включится. Соответственно никаких активитей нету чтобы службу запустить. |
| Автор: PiyodaiSiyo 19.2.2012, 09:57 |
| Ваш таск киллер по всей видимости это скомпилировання прога. если служба пишется вами: "If a component starts the service by calling startService() (which results in a call to onStartCommand()), then the service remains running until it stops itself with stopSelf() or another component stops it by calling stopService()." Можно проследить выполняется ли onDestroy() службы перекрыв его и дать вам знать. И если да значит ваш сервис "умирает" но запускается из-за Intenta в манифесте.надо там поправить кое что что запускает его постоянно(в доках где то есть) если сторонняя-- незнаю(видимо там хитрости с Intent ами, что служба перезапускается) |
| Автор: McBlob 19.2.2012, 12:48 |
| Таск киллер стандартный MIUI. Сервис мой. onDestroy не выполняется, а когда система перезапускает сервис сама, то выполняется только onCreate() Собсна система то сервис перезапускает, но только когда телефон активен (экран включён) |
| Автор: PiyodaiSiyo 19.2.2012, 14:31 |
| onDestroy() The system calls this method when the service is no longer used and is being destroyed. Your service should implement this to clean up any resources such as threads, registered listeners, receivers, etc. This is the last call the service receives. стало быть вы неправильно организовали уничтожение копонента(в данном случае сервис(служба)) и надо добиться чтоб этот медод вызывался или ваш миуи просто вызывает onUnbind(...)(попробуйте вызвать оттуда stopSelf()) или же сушествуе какойто компонент (сервис ,активити который запускает последний но при "умирании" забывает вызвать someSrvc.stopService() вот он и висит (не забывайте вызывать везде super() при перекрытии) даже может быть что там вызываются копии этого сервиса(а то чего это onCreate(... ) каждый раз зовет) |
| Автор: McBlob 20.2.2012, 09:07 |
| Мне кажется, что возникло недопонимание. Есть моя программа в которой есть активити и мой же сервис. Активити запускает сервис вызовом startService() и закрывается finish(). Сервис при этом продолжает работать (собсна в этом и есть смысл сервиса - работать без активити). Под Андройд есть куча программок - таск киллеров которые убивают программы и сервисы висящие в памяти. Я ими не пользуюсь так как в MIUI (это сборка андройда) есть свой встроенный киллер, типа как в сенсе. Проблема заключается в том, что если убить процессы киллером и сразу выключить экран телефона, то мой сервис не перезапускается, хотя другие перезапускаются. Если же экран не выключать, то всё отлично перезапускается. super пишу во всех перегружаемых методах. Интересно то, что когда сервис запускаю я, вызывая startService(), то у сервиса отрабатывает сначала onCreate(), а потом onCommandStart(), а когда сервис перезапускает система, то onCommandStart() не отрабатывает. Цель всего этого - сервис должен работать постоянно пока я сам его не остановлю вызвав stopService(); |
| Автор: PiyodaiSiyo 21.2.2012, 03:12 |
| гляньте в сторону onConfigChanged(Config cf)где любыеизменения-рестарты можно прописать в блоке if(cf.uiMode==Config.UI_UNDEFINED){...} где cf это ваша новая конфигурация экрана переданная системой кодеру.Config.XXXX-маски. |
| Автор: McBlob 21.2.2012, 12:38 |
| Так а кто будет обрабатывать onConfigChanged(Config cf), если на момент выключения экрана служба не работает (она жестоко убита таск киллером Мне кажется, что тут надо её как то хитро запускать, типа как системную что ли... Чтоб она в любом случае перезапускалась системой, либо вообще её нельзя было прибить. |
| Автор: PiyodaiSiyo 21.2.2012, 19:50 |
| Сервис мой. onDestroy не выполняется Стоп стоп если этот дестрой не отработал (вызывается гдето внутри finish()),ваша активити ЖИВА .попробуйте убить в еешней onStop сервис и в onResume стартовать его.Кроме того у него если не выгорит на крайняк есть свой онкофигчейнжд(не рекомендуется).Е сли долго долбить желаемая дырка п оявиться |
| Автор: McBlob 22.2.2012, 16:47 |
| А при чём тут активити и его finish()? Сервис должен работать независимо от того жива активити или нет. Если я сам останавливаю сервис при помощи Activity.stopService(), то Service.onDestriy() отлично отрабатывает. Он не отрабатывает когда я чищу память таск киллером (видать он не вызывает stopService(), а как то жестоко убивает всё, что в памяти). В любом случае следующей строчкой после this.startService(intent) у меня идёт this.finish(); |
| Автор: PiyodaiSiyo 22.2.2012, 19:58 |
| я имею в виду что когда миуи стопает ваш сервис его перезапускает активити (которая оказывается не убита не смотря на вызываемый финиш[так частенько случается если не остановленны некоторые треды или прослушка сенсоров]).А если стопает и + операция с экраном--она не перезапускает(живая активити) етот сервис.поэтому я и предполагаю что надо общаться с онрезьюмом принадлежащим активити. ну кась проведите трассировку этого метода. |
| Автор: McBlob 24.2.2012, 09:29 |
| А с чего это вдруг активити должна перезапускать сервис, если бы даже она была жива? Активити запускает сервис только по нажатию кнопки (у меня так сделано). Ну и никаких тредов и прослушки сенсоров нету. Актовити только читает/пишет настройки в файл и запускает/останавливает службу. |