Моя проблема заключается в том, что когда IM нажимает кнопку «Домой» и закрывает мое приложение, в это время фоновая служба останавливается, и после этого требуется снова войти в приложение, после чего фоновая служба запускается, так что как я могу сделать, как WhatsApp, если приложение закроется или будет закрыто, тогда также может работать служба Запустить в фоновом режиме.....
Фоновая служба остановлена, когда активность уничтожена или остановлена или принудительно закрыта
Ответы (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);
}
Что делает этот код, так это то, что он перезапускает процесс вашего приложения после его уничтожения при уничтожении вашей активности.
Это очень просто, просто следуйте сценариям по ссылке ниже.
Продолжить обслуживание, даже если приложение удалено из Недавнее приложение
ваша служба и процессы (потоки, запущенные внутри вашей службы) останутся непрерывными.
Хорошо, я просто предполагаю - действительно не хочу проверять весь код вашего приложения.
Службу можно запустить двумя способами:
- Использование bindService(), что, вероятно, вы здесь делаете. Это хорошо, но это означает, что служба будет удалена, как только последний клиент отвяжет ее (что вы, вероятно, делаете в каком-то методе onPause().
- С помощью команды startService(). В таком случае служба будет работать до тех пор, пока вы ее остановите, или система будет считать, что эта служба использует слишком много памяти, которую следует использовать для какой-то более срочной задачи (например, какой-то жирной активности)
Быстрое решение вашей проблемы (если мои догадки верны) будет заключаться в переключении службы на запуск в режиме «startService». Если вы не хотите много играть со своим кодом, лучше всего поместить его в метод onBind() вашего сервиса (просто попробуйте запустить сервис из самого себя). Конечно, это не запустит службу, но переключит ее режим на «длительный, реальный фоновый». Это не решит всех ваших проблем, как я уже упоминал выше - служба все еще может быть убита системой, чтобы получить больше ресурсов. Вы можете предотвратить это несколькими способами: если вы действительно хотите, чтобы служба работала, вам следует рассмотреть возможность использования службы переднего плана (погуглите), что увеличит шансы службы на выживание. Но лучший вариант — просто использовать жизненный цикл службы, сохранять данные при необходимости и загружать их при запуске службы, как вы должны делать с активностью. Для долго работающих фоновых служб также есть опция start sticky, которая запустит службу после каждого убийства, сбоя и т. д.