В моем приложении есть служба, которая должна оставаться в живых даже после того, как пользователь закроет ее (смахнув ее). Моя служба распечатывает сообщения журнала каждую секунду в параллельном потоке.
Хотя он действительно возвращает START_STICKY
, он завершается, как только приложение закрывается пользователем. Вот мой метод onStartCommand
:
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
instance = this;
Log.i("Service", "started");
new Thread(() -> {
int i = 0;
while (true) {
Log.i("Service", "#" + ++i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
start_recording(null);
return START_STICKY;
}
Я также объявил это в манифесте:
<service
android:name = ".MyService"
android:stopWithTask = "false"
/>
Как я могу предотвратить прерывание потока системой при выходе из приложения? Никакой другой пост SO не предоставил мне решение, которое работает.
Нет, это становится ложным только в onDestroy()
. Предположим, что это всегда правда
Какую версию ОС используете?
@Sagar на Android 8.1
На основе документация:
When an app goes into the background, it has a window of several minutes in which it is still allowed to create and use services. At the end of that window, the app is considered to be idle. At this time, the system stops the app's background services, just as if the app had called the services' Service.stopSelf() methods.
Начиная с Android O
ОС вводит несколько ограничений на то, насколько свободно могут выполняться фоновые службы. Через X минут после выхода приложения службы будут прекращены, как если бы был вызван stopSelf()
. Вам нужно использовать ForegroundService
, если вы все еще хотите продолжить, но вам нужно учитывать влияние на время автономной работы. Если вы выполняете интенсивную работу с ЦП, то использование ForegroundService
не поможет.
Вы можете обратиться к моему ответу в этом ТАК для получения дополнительной информации.
Спасибо. У меня просто проблема: ForegroundService - это не тот класс, который я могу расширить. Как я могу создать службу переднего плана?
Вам необходимо продлить его как обычную услугу. Изменился способ его названия. Вместо того, чтобы звонить startService()
, вы позвоните в startForegroundService()
, посмотрите этот ТАК
может быть,
keepAlive
станет ложным?