Служба Android останавливается, когда приложение закрыто

Я запускаю службу из своей основной деятельности Android следующим образом:

final Context context = base.getApplicationContext(); final Intent intent = new Intent(context, MyService.class); startService(intent); 

Когда я закрываю страницу активности, вытаскивая ее из недавнего списка приложений, служба перестает работать и перезапускается через некоторое время. Я не могу использовать постоянные службы с уведомлениями из-за требований к моему приложению. Как я могу заставить службу НЕ перезапускать или выключать и просто продолжать работу при выходе из приложения?

Я в той же ситуации, пока я узнал, когда приложение закрыто, сервис закрывается и потому, что он находится в одном streamе, поэтому служба должна быть в другом streamе, чтобы она не закрывалась, посмотрите на это и посмотрите, как поддерживать сервис с диспетчером аварийных ситуаций здесь, например, http://www.vogella.com/articles/AndroidServices/article.html таким образом, ваша служба не будет отображаться в уведомлении.

наконец, после всех исследований, которые я сделал, я прихожу к пониманию, что лучшим выбором для долгого обслуживания является startForeground() , потому что он сделан для этого, и система действительно имеет дело с вашим сервисом.

Это может вам помочь. Возможно, я ошибаюсь, но мне кажется, что это связано с возвратом START_STICKY в ваш onStartCommand() . Вы можете избежать повторного START_NOT_STICKY службы, возвращая START_NOT_STICKY .

сделай так, чтобы ты служил в своем

   

то ваша служба будет работать в другом процессе с именем ServiceProcess


если вы хотите, чтобы ваша служба никогда не умирала:

  1. onStartCommand () вернуться START_STICKY

  2. onDestroy () -> начало

  3. создать службу Deamon

  4. jin -> создать процесс Native Deamon, вы можете найти некоторые проекты с открытым исходным кодом на github

  5. startForeground (), есть способ начатьForeground без уведомления, google it

Иногда услуги довольно сложны.

Когда вы запускаете службу из своего действия (или вашего процесса), служба по существу работает в одном процессе.

цитата из заметок разработчика

Большая путаница в отношении classа Service фактически вращается вокруг того, что это не так:

Служба не является отдельным процессом. Сам объект службы не подразумевает, что он работает в своем собственном процессе; если не указано иное, он работает в том же процессе, что и приложение, в котором оно входит.

Служба не является нитью. Это не значит, что нужно выполнять работу основного streamа (чтобы избежать ошибок, связанных с ошибками приложения).

Таким образом, это означает, что если пользователь удалит приложение из последних задач, он удалит ваш процесс (включая все ваши действия и т. Д.). Теперь давайте рассмотрим три сценария.

Сначала, когда служба не имеет уведомления переднего плана.

В этом случае ваш процесс будет убит вместе с вашим сервисом.

Во-вторых, если служба имеет предварительное уведомление

В этом случае служба не убивается, и ни один процесс

Третий сценарий Если служба не имеет предварительного уведомления, она все равно может работать, если приложение закрыто. Мы можем сделать это, запустив службу в другом процессе. (Тем не менее, я слышал, что некоторые люди говорят, что это может не сработать, оставил вам попробовать сами )

вы можете создать службу в отдельном процессе, включив в свой манифест атрибут ниже.

Android: процесс = “: yourService”

или

android: process = “yourService” имя процесса должно начинаться с нижнего регистра.

цитата из заметок разработчика

Если имя, присвоенное этому атрибуту, начинается с двоеточия (‘:’), новый процесс, частный для приложения, создается, когда это необходимо, и служба запускается в этом процессе. Если имя процесса начинается с символа в нижнем регистре , служба будет выполняться в глобальном процессе этого имени при условии, что у него есть разрешение на это. Это позволяет компонентам в разных приложениях совместно использовать процесс, уменьшая использование ресурсов.

это то, что я собрал, если кто-то эксперт, пожалуйста, поправьте меня, если я ошибаюсь 🙂

попробуйте это, это заставит службу работать в фоновом режиме.

BackServices.class

 public class BackServices extends Service{ @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // Let it continue running until it is stopped. Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show(); } } 

в вашем MainActivity onCreate onCreate эту строку кода

 startService(new Intent(getBaseContext(), BackServices.class)); 

Теперь служба будет работать в фоновом режиме.

Основная проблема в том, что вы не можете запустить службу, когда приложение закрыто, ОС Android ( в некоторых ОС ) убьет службу для оптимизации ресурсов. Если вы не можете перезапустить службу, тогда вызовите ящик тревоги, чтобы запустить ресивер, как это, здесь это весь код, этот код будет поддерживать сервис ur.

Манифест,

        

IN Main Activity запускает тревожный ящик таким образом,

 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,

 public class AlarmReceiver extends BroadcastReceiver { Context context; @Override public void onReceive(Context context, Intent intent) { this.context = context; System.out.println("Alarma Reciver Called"); if (isMyServiceRunning(this.context, BackgroundService.class)) { System.out.println("alredy running no need to start again"); } else { Intent background = new Intent(context, BackgroundService.class); context.startService(background); } } public static boolean isMyServiceRunning(Context context, Class serviceClass) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List services = activityManager.getRunningServices(Integer.MAX_VALUE); if (services != null) { for (int i = 0; i < services.size(); i++) { if ((serviceClass.getName()).equals(services.get(i).service.getClassName()) && services.get(i).pid != 0) { return true; } } } return false; } } 

И этот рекрутер Alaram называет один раз, когда приложение Android открыто и когда приложение закрыто. SO, сервис подобен этому,

 public class BackgroundService extends Service { private String LOG_TAG = null; @Override public void onCreate() { super.onCreate(); LOG_TAG = "app_name"; Log.i(LOG_TAG, "service created"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(LOG_TAG, "In onStartCommand"); //ur actual code return START_STICKY; } @Override public IBinder onBind(Intent intent) { // Wont be called as service is not bound Log.i(LOG_TAG, "In onBind"); return null; } @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); Log.i(LOG_TAG, "In onTaskRemoved"); } @Override public void onDestroy() { super.onDestroy(); Log.i(LOG_TAG, "In onDestroyed"); } } 

Лучшим решением является использование адаптера синхронизации в android для запуска службы. Создайте адаптер синхронизации и вызовите службу запуска .. внутри метода onPerformSync. для создания учетной записи синхронизации обратитесь к этой ссылке https://developer.android.com/training/sync-adapters/index.html.

Почему SyncAdapter? Ответ: Потому что раньше вы запускали службу, используя свой контекст приложения. поэтому всякий раз, когда ваш процесс приложения убивается (когда вы удаляете его из диспетчера задач или ОС убиваете его из-за нехватки ресурсов), в то время ваша служба также будет удалена. SyncAdapter не будет работать в streamе приложения .. так что если u вызовет внутри него, то услуга больше не будет удалена .. если вы не напишите код, чтобы удалить его.

Использование одного и того же процесса для службы и активности и START_STICKY или START_REDELIVER_INTENT в сервисе является единственным способом перезапуска службы при перезапуске приложения, которое происходит, когда пользователь закрывает приложение, например, а также когда система решает закрыть его по соображениям оптимизации. У вас нет службы, которая будет работать постоянно без прерывания. Это по дизайну, смартфоны не предназначены для непрерывного непрерывного процесса в течение длительного периода времени. Это связано с тем, что срок службы батареи является наивысшим приоритетом. Вам нужно спроектировать свою услугу, чтобы она была остановлена ​​в любой момент.

Почему бы не использовать IntentService?

IntentService открывает новую тему отдельно от основного streamа и работает там, таким образом закрывая приложение, не будет его влиять

Имейте в виду, что IntentService запускает onHandleIntent (), и когда он завершает работу службы, проверьте, соответствует ли она вашим потребностям. http://developer.android.com/reference/android/app/IntentService.html

  

Объявите это в своем манифесте. Укажите свое имя для своего процесса и сделайте этот процесс изолированным и экспортированным.

Вы должны добавить этот код в свой class Service, чтобы он обрабатывал случай, когда ваш процесс убит

  @Override public void onTaskRemoved(Intent rootIntent) { Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); restartServiceIntent.setPackage(getPackageName()); PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); alarmService.set( AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); super.onTaskRemoved(rootIntent); } 

Запуск службы намерения будет проще. Служба создания streamа в приложении, но все еще находится в приложении.

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

  • Android Context.bindService всегда возвращает false, а объект ServiceConnection никогда не запускается
  • Получаю ли я права на проверку подписки на Android в приложении?
  • Попытка запуска службы при загрузке на Android
  • ServiceRoute + WebServiceHostFactory убивает генерацию WSDL? Как создать службу WCF без расширения с помощью? Wsdl
  • Android-сервис убит
  • Android - внедрение startForeground для службы?
  • onTaskRemoved () не получает вызов в устройствах HUAWEI и XIOMI
  • Использование службы для запуска фона и создания уведомлений
  • Диалоговое окно оповещения из службы Android
  • Как вы реализуете FileObserver из службы Android
  • Реализация NotificationListenerService
  • Давайте будем гением компьютера.