Я запускаю службу из моей основной деятельности Android следующим образом:
final Context context = base.getApplicationContext();
final Intent intent = new Intent(context, MyService.class);
startService(intent);
когда я закрываю страницу активности, проводя ее из списка последних приложений, служба перестает работать и перезапускается через некоторое время. Я не могу использовать постоянные службы с уведомлениями из-за моих требований к приложению. Как я могу заставить службу не перезагружаться или выключаться и просто продолжать работать при выходе из приложения?
13 ответов:
Я в той же ситуации, до сих пор я узнал, когда приложение закрыто служба закрывается также потому, что они находятся в одном потоке, поэтому служба должна быть в другом потоке, чтобы она не была закрыта, посмотрите на это и посмотрите, чтобы сохранить службу в живых с помощью Alarm manager здесь пример http://www.vogella.com/articles/AndroidServices/article.html таким образом, ваш сервис не будет отображаться в уведомлении.
наконец, после всех исследований я сделал, я приходя к пониманию, что лучший выбор для длительного обслуживания является startForeground() , потому что это сделано для этого, и система на самом деле имеет дело с вашим сервисом хорошо.
2016-06-25 17:55:36 aljuaid86
этой может помочь вам. Я могу ошибаться, но мне кажется, что это связано с возвращением START_STICKY в своем onStartCommand() метод. Вы можете избежать повторного вызова службы, вернув START_NOT_STICKY вместо.
2017-05-23 15:02:34 artex
сделать вам обслуживание, как это в вашем Манифеста
- onStartCommand () return START_STICKY
- onDestroy() -> startself
- создать службу Deamon
- jin — > создайте собственный процесс Deamon, вы можете найти некоторые проекты с открытым исходным кодом на GitHub
- startForeground (), есть способ startForeground без уведомления, google it
2016-07-22 11:26:06 alanban
услуги иногда довольно сложны.
когда вы запускаете службу из действия (или вашего процесса), служба по существу находится в том же процессе.
цитирование из заметок разработчика
большинство путаницы о классе обслуживания на самом деле вращается вокруг того, что это не так:
служба не является отдельным процессом.
Сам объект службы не подразумевает, что он работает в своем собственном процессе; если не указано иное, он работает в том же процессе, что и приложение, частью которого он является.
служба не является потоком. Это не само средство для выполнения работы с основным потоком (чтобы избежать ошибок приложения, не отвечающих на запросы).
Итак, что это значит, если пользователь убирает приложение от последних задач, он удалит ваш процесс(это включает в себя все ваши действия и т. д.). Теперь давайте рассмотрим три сценария.
Разработка приложений под Android. Базовый курс. Урок 7. Сервисы.
первый где служба нет уведомления переднем плане.
в этом случае ваш процесс будет убит вместе с вашим сервисом.
второй где служба и уведомление переднего плана
в этом случае служба не убита и процесс не является
третий сценарий Если служба не имеет уведомления переднего плана, она все равно может продолжать работать, если приложение закрыто. Мы можем сделать это путем запуска услуги в другом процессе. (Однако я слышал, что некоторые люди говорят, что это может не сработать. осталось вам попробовать его самостоятельно)
вы можете создать сервис в отдельном процессе, включив атрибут ниже в вашем манифесте.
android: process=»: yourService»
android: process= «yourService» имя процесса должно начинаться с нижнего случай.
цитирование из заметок разработчика
Если имя, присвоенное этому атрибуту, начинается с двоеточия ( ‘ :’), то при необходимости создается новый процесс, закрытый для приложения, и служба запускается в этом процессе. Если имя процесса начинается с строчные буквы символ, служба будет работать в глобальном процессе с таким именем, при условии, что у нее есть разрешение на это. Это позволяет компонентам в различных приложениях совместно использовать процесс, сокращение использования ресурсов.
это то, что я собрал, если кто знаток, пожалуйста, поправьте меня, если я ошибаюсь 🙂
2017-08-31 22:10:56 mmmcho
попробуйте это, он будет держать службу работает в фоновом режиме.
BackServices.класс
в своем MainActivity onCreate брось эту строку кода
startService(new Intent(getBaseContext(), BackServices.class));
Теперь служба будет работать в фоновом режиме.
2016-12-13 10:36:27 Youssef Al Subaihi
основная проблема в неспособности запустить службу, когда приложение закрыто, Android OS (в некоторых ОС) убьет службу для оптимизации ресурсов,если вы не можете перезапустить службу,а затем вызвать аварийную кормушку, чтобы запустить приемник, как это, вот весь код, этот код будет поддерживать службу ur.
Манифест,
в основном Activty начать сигнализацию кормушки таким образом,
String alarm = Context.ALARM_SERVICE; AlarmManager am = (AlarmManager) getSystemService(alarm); Intent intent = new Intent(«REFRESH_THIS»); PendingIntent pi = PendingIntent.getBroadcast(this, 123456789, intent, 0); int type = AlarmManager.RTC_WAKEUP; long interval = 1000 * 50; am.setInexactRepeating(type, System.currentTimeMillis(), interval, pi);
это вызовет reciver и reciver есть
и этот alaram reciver вызывает один раз, когда приложение для android открыто и когда приложение closed.SO служба такая,
2017-01-17 09:10:00 Ajith K P
лучшее решение-использовать адаптер синхронизации в android для запуска службы. Создайте адаптер синхронизации и вызовите службу запуска их.. внутри метода onPerformSync. чтобы создать учетную запись синхронизации, пожалуйста, перейдите по этой ссылке https://developer.android.com/training/sync-adapters/index.html
Почему SyncAdapter? Ответ: Потому что раньше вы использовали для запуска службы с помощью контекста приложения. поэтому всякий раз, когда ваш процесс приложения убивают (когда u удалить его из Диспетчера задач или ОС убить его из-за нехватки ресурсов ) в это время ваш сервис также будет удален. SyncAdapter не будет работать в потоке приложения.. так что если вы позвоните в него.. сервис больше не будет удален.. если вы не напишите код, чтобы удалить его.
2017-07-06 11:08:03 Nishanth S Babu
использование одного и того же процесса для службы и действия и START_STICKY или START_REDELIVER_INTENT в службе-это единственный способ перезапустить службу при перезапуске приложения, что происходит, например, когда пользователь закрывает приложение, но также и когда система решает закрыть его по причинам оптимизации. Вы не можете иметь службу, которая будет работать постоянно без перерыва. Это по дизайну, смартфоны не предназначены для запуска непрерывных процессов для длительный период времени. Это связано с тем, что срок службы батареи является наивысшим приоритетом. Вам нужно создать свой сервис так, чтобы он обрабатывал остановку в любой момент.
2017-08-06 12:57:51 stef
Почему бы не использовать IntentService?
IntentService открывает новый поток отдельно от основного потока и работает там, таким образом, закрытие приложения не повлияет на него
имейте в виду, что IntentService запускает onHandleIntent (), и когда это сделано, служба закрывается, посмотрите, соответствует ли она вашим потребностям. http://developer.android.com/reference/android/app/IntentService.html
2015-05-31 12:02:36 sharon gur
объявите это в своем манифесте. Дайте процессу пользовательское имя и сделайте его изолированным и экспортированным .
2017-07-07 13:37:38 Nishanth S Babu
вы должны добавить этот код в свой класс обслуживания, чтобы он обрабатывал случай, когда ваш процесс убивается
2017-10-03 10:45:47 Kaustubh Bhagwat
запуск службы intent будет проще. Служба в создании потока в приложении, но он все еще находится в приложении.
2017-11-15 00:52:05 Seb
просто переопределите метод onDestroy в своей первой видимой активности, например, после всплеска у вас есть домашняя страница, и при перенаправлении с всплеска на домашнюю страницу вы уже закончили всплеск. так что положите на уничтожить в домашней странице. и остановить обслуживание в этом методе.
Источник: codengineering.net
Неубиваемый Service Android (Boot,Foreground,Sticky)
В основные задачи программы входит выполнение методов в фоновом режиме, для чего используется Android Services. Необходимо запустить Service таким образом, чтобы после закрытия MainActivity сервис оставался в рабочем состоянии и мог создавать уведомления, а также, в случае закрытия системой или же перезагрузки, самостоятельно восстанавливался. На данный момент основная проблема состоит в поддержании жизни в MyService после закрытия пользовательского интерфейса. AutoStart: В AndroidManifest.xml были прописаны
В BootReceiver.java:
Service: В AndroidManifest.xml прописано:
В MyService.java находится следующий код, за исключением некоторых частей (описаны наиболее важные элементы, в которых могут находиться ошибки, не позволяющие решить поставленную задачу):
public void onCreate()
public int onStartCommand(Intent intent, int flags, int startId)
public void sendNotification(String Ticker,String Title,String Text) < Intent notificationIntent = new Intent(this, MainActivity.class); notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER); PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentIntent(contentIntent) .setOngoing(true) //invulnerable .setTicker(Ticker) .setContentTitle(Title) .setContentText(Text) .setWhen(System.currentTimeMillis()); Notification notification; if (android.os.Build.VERSION.SDK_INT<=15) < notification = builder.getNotification(); // API 15 and lower >else < notification = builder.build(); >startForeground(DEFAULT_NOTIFICATION_ID,notification);
Запускается MyService из MainActivity следующим образом:
Intent intentService;
public void runService() < boolean working = isMyServiceRunning(MyService.class); if (!working) < startService(intentService); >else < stopService(intentService); >>
public boolean isMyServiceRunning(Class serviceClass) < ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) < if (serviceClass.getName().equals(service.service.getClassName())) < return true; >> return false; >
Просьба указать на допущенные в ходе программирования ошибки, дополнив их сторонними материалами (примерами) или ключевыми словами для поиска.
Отслеживать
Mikhail Kolesnikov
задан 9 янв 2016 в 17:23
Mikhail Kolesnikov Mikhail Kolesnikov
375 1 1 золотой знак 3 3 серебряных знака 9 9 бронзовых знаков
А сервис у вас какой класс расширяет? Service или IntentService ?
9 янв 2016 в 20:46
10 янв 2016 в 9:08
IntentService вроде бы не должен работать постоянно. Он задачу выполняет и завершается.
10 янв 2016 в 9:50
В качестве примера работы могу предложить для анализа приложение «Будильник Xtreme». Приложение автоматически запускается вместе с сервисом после загрузки смартфона, а также восстанавливается после закрытия в recentTaskBar. Всё это происходит в фоновом режиме, т.е. пользовательский интерфейс каждый раз не открывается, однако в списке уведомлений всегда держится сообщение о том, что сервис находится в рабочем состоянии. Процесс в диспетчере всего один, к которому и прикреплён Service. В случае закрытия процесса автоматически происходит Restart.
10 янв 2016 в 10:39
Да, подробный ответ будет крайне интересен и полезен. Ждём)
14 янв 2016 в 13:01
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для адекватной работы всех предъявленных к «бессмертному» сервису требований потребовалось деинсталлировать нерабочую версию с устройства, после чего загрузить свежую сборку. Вызвано это было, вероятнее всего, именно разрешениями. Построение своей программы я начал практически с нуля, поэтому после первой установки приложению было выдано недостаточное для реализации функций «бессмертного» сервиса количество разрешений. На данный момент приложением используется всего два разрешения: Notifications и Autostart. На эту мысль меня натолкнула полная работоспособность приложения на всех прочих устройствах.
Я постараюсь отразить в этом ответе все элементы кода, необходимые для работы «бессмертного» сервиса.
Android Manifest:
MainActivity:
public class MainActivity extends AppCompatActivity < Intent intentService; protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); intentService = new Intent(this,MyService.class); >public void click_Service(View v) < if (!isMyServiceRunning(MyService.class)) < startService(intentService); >else < stopService(intentService); >> private boolean isMyServiceRunning(Class serviceClass) < ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) < if (serviceClass.getName().equals(service.service.getClassName())) < return true; >> return false; > >
MyService:
MyReceiver:
Таким образом, мы получаем сервис, который автоматически запускается после старта системы. Пользовательский интерфейс может быть вызван нажатием на уведомление, которое невозможно убрать из панели уведомлений. После открытия пользовательского интерфейса сервис может быть отключён или включён вручную нажатием на соответствующую кнопку. В случае закрытия приложения, включая свайп приложения из Recent Task Bar’а, сервис останется включённым и продолжит свою работу.
Единственным возможным способом закончить работу MyService без использования пользовательского интерфейса является закрытие процесса Application при помощи Force Stop в списке приложений или же остановка самого процесса вручную в меню настроек системы.
Источник: ru.stackoverflow.com
Android. Собеседование #10. Services
1. Какой жизненный цикл у Service?
– onCreate()
Вызывается один раз при первом создании сервиса методом startService(). Не вызывается при повторном использовании метода startService().
– onStartCommand()
Вызывается каждый раз при получении сервисом команды, отправленной с помощью метода startService(). Метод может возвращать флаг, который запускает сервис в определённом режиме
– onBind()
Вызывается при привязке (сервис живёт, пока жив клиент) сервиса к клиенту (Activity) при помощью метода bindService()
– onRebind()
Вызывается при повторной привязке сервиса к клиенту
– onUnbind()
Вызывается при отвязке сервиса от клиента
– onDestroy()
Вызывается при уничтожении сервиса
2. Какие существуют разновидности сервисов?
Сервисы можно разделить на три вида:
– Foreground Service
Сервис запущенный в данном режиме имеет высокий приоритет и не будет уничтожен системой, в случае нехватки памяти. Такой Service связывается с Notification, которое будет отображаться в статус баре. Запускается при помощи метода startForeground().
– Background Service
Работает в стандартном режиме, в фоне, в основном потоке приложения. Запускается при помощи метода startService().
– Bound Service
Service запущенный в данном режиме привязывается к какому-либо клиенту, например к Activity, и работает по принципу клиент-сервер. Service может быть привязан к нескольким клиентам, при этом система уничтожит сервис в случае, если все клиенты связанные с ним были уничтожены. Запускается при помощи метода bindService(). Для открепления сервиса от клиента используется метод unbindService(). При помощи интерфейса IBinder можно получить ссылку на наш сервис и вызывать методы непосредственно в нашем сервисе.
3. Что такое Intent Service?
Intent Service – наследник класса Service. В отличие от Service, выполняется асинхронно в отдельном потоке. Сервис запускается методом startService() в котором передается Intent с необходимыми данными для работы. Обрабатывает входящий Intent в методе onHandleIntent(). После завершения всех необходимых операций над данными сервис прекращает свою работу.
4. Какие флаги запуска можно задать сервису?
Метод жизненного цикла сервиса onStartCommand()С может возвращать флаг, который описывает поведение сервиса, в случае если он был неожиданно остановлен, например системой из-за нехватки памяти:
– START_STICKY
Сервис будет заново запущен системой и продолжит работу
– START_REDELIVER_INTENT
Сервис будет заново запущен системой и заново получит Intent который был передан методом startService() при запуске сервиса
– START_NOT_STICKY
Сервис остается в остановленном положении и не будет заново запущен системой
– STOP_FOREGROUND_REMOVE
Используется для отмены режима foreground и удаления Notification с которым связан сервис.
Отменить ответ
Разделы
- Kotlin. Вопросы. Stack Of Questions
- Вопросы. Stack Of Questions
- Собеседование по Android
Источник: stackofskills.com
Находки программиста
Решения конкретных задач программирования. Java, Android, JavaScript, Flex и прочее. Настройка софта под Linux, методики разработки и просто размышления.
среда, 13 ноября 2013 г.
«Вечный Service» в Android
Когда мы делаем приложения, мы руководствуемся самыми гумаными соображениями. Мы хотим облегчить жизнь нашим клиентам, помочь им, защитить, вооружить против любых проблем этого ужасного мира. Но клиенты почему-то не хотят покоряться нашему мудрому руководству.
Закрывают наше приложения, останавливают его, находят в списке «запущенных процессов» через настройки и опять-таки останавливают. Ну, как дети малые, ей-богу 😉 Если вы в своей всеобъемлющей мудрости хотите спасти своих клиентов от их самих, вам наверняка прийдётся защититься от их жалких попыток упавлять своим смартфоном. Как же это сделать?
Перенести логику в Service, чтобы закрытие приложения не останавливало его работу? Недостаточно. Сделать в нём вечный цикл, вызвать startService() в onDestroy() — тоже. В конце концов эти неразумные существа могут перезагрузить смартфон и мы утратим над ними власть не сможем помогать им.
Можно, конечно ловить событие загрузки (и ещё стопицот других системных событий) и поднимать наш сервис. Однако система на то и система, чтобы жить своими, непредсказуемыми событиями, а значит никакой гарантии, что эти события произойдут когда нам нужно, увы, нет. Как же нам быть? Ответ очевиден:
AlarmManager
Этот механизм позволяет нам не ждать милостей от природы событий от системы, а «заказывать» ей свои собственные события. Мы говорим системе «разбудить» наше приложение через Х секунд и делаем то что нам нужно в течении этих Х секунд а потом завершаем работу. Если пользователь или система убили нас раньше, их радость будет недолгой. Наше приложение возродится как феникс и продолжит свою работу. Такая схема позволяет нам гарантированно и независимо от прихотей платформы оставаться в памяти всегда. Вот как это выглядит:
Это пока только Activity c кнопкой-переключателем. Сам сервис:
И не забываем добавить в AndroidManifest (в тег application) строки:
android_name=».EternalService$Alarm» android_exported=»true»> > android_name=»net.multipi.ALARM» /> > > android_name=».EternalService» />
Но, шутки в сторону
Во-первых, лучший способ помогать своим пользователям — не создавать им новых проблем. Если вы всё-таки решили висеть в памяти их смартфона, то хотя бы не держите открытыми сетевые соединения и (не дай бог) не слушайте спутники GPS. Посадите клиенту батарею и потеряете клиента.
Во-вторых, сервис всё-таки не вечный. Приложение, которое «убили» в настройках перестаёт получать Broadcast-ы а значит уже не оживёт, пока клиент не запустит его снова.
И да, не ставьте слишком короткий интервал вызова вашего сервиса. В большинстве случаев ваш сервис будет ещё жив и вы его проигнорируете, а для системы такие вызовы совсем не «бесплатны».
Источник: findevelop.blogspot.com