Фоновая служба остановлена, когда активность уничтожена или остановлена ​​или принудительно закрыта

Моя проблема заключается в том, что когда IM нажимает кнопку «Домой» и закрывает мое приложение, в это время фоновая служба останавливается, и после этого требуется снова войти в приложение, после чего фоновая служба запускается, так что как я могу сделать, как WhatsApp, если приложение закроется или будет закрыто, тогда также может работать служба Запустить в фоновом режиме.....


person Bhavesh Thacker    schedule 17.03.2014    source источник
comment
Вы ДЕЙСТВИТЕЛЬНО ожидаете, что smd проверит репозиторий, на который вы ссылаетесь, на наличие всех ошибок, которые вы сделали? Вставьте сюда код, чтобы запустить службу.   -  person piotrpo    schedule 17.03.2014


Ответы (3)


У меня такая же проблема. Когда вы смахиваете приложение с панели приложений, процесс фоновой службы останавливается.

Вы можете добавить следующий код в свою службу или посмотреть этот вопрос

@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);
}

Что делает этот код, так это то, что он перезапускает процесс вашего приложения после его уничтожения при уничтожении вашей активности.

person geekoraul    schedule 17.03.2014
comment
Когда я смахиваю приложение из панели приложений, onTaskRemoved вызывает обратный вызов, но служба не запускается, почему? - person Prashanth Debbadwar; 22.01.2016

Это очень просто, просто следуйте сценариям по ссылке ниже.

Продолжить обслуживание, даже если приложение удалено из Недавнее приложение

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

person Avnish Choudhary    schedule 07.08.2017

Хорошо, я просто предполагаю - действительно не хочу проверять весь код вашего приложения.

Службу можно запустить двумя способами:

  1. Использование bindService(), что, вероятно, вы здесь делаете. Это хорошо, но это означает, что служба будет удалена, как только последний клиент отвяжет ее (что вы, вероятно, делаете в каком-то методе onPause().
  2. С помощью команды startService(). В таком случае служба будет работать до тех пор, пока вы ее остановите, или система будет считать, что эта служба использует слишком много памяти, которую следует использовать для какой-то более срочной задачи (например, какой-то жирной активности)

Быстрое решение вашей проблемы (если мои догадки верны) будет заключаться в переключении службы на запуск в режиме «startService». Если вы не хотите много играть со своим кодом, лучше всего поместить его в метод onBind() вашего сервиса (просто попробуйте запустить сервис из самого себя). Конечно, это не запустит службу, но переключит ее режим на «длительный, реальный фоновый». Это не решит всех ваших проблем, как я уже упоминал выше - служба все еще может быть убита системой, чтобы получить больше ресурсов. Вы можете предотвратить это несколькими способами: если вы действительно хотите, чтобы служба работала, вам следует рассмотреть возможность использования службы переднего плана (погуглите), что увеличит шансы службы на выживание. Но лучший вариант — просто использовать жизненный цикл службы, сохранять данные при необходимости и загружать их при запуске службы, как вы должны делать с активностью. Для долго работающих фоновых служб также есть опция start sticky, которая запустит службу после каждого убийства, сбоя и т. д.

person piotrpo    schedule 17.03.2014