Как сохранить липкую службу без выполнения кода в основном потоке?

В моем приложении есть служба, которая должна оставаться в живых даже после того, как пользователь закроет ее (смахнув ее). Моя служба распечатывает сообщения журнала каждую секунду в параллельном потоке.

Хотя он действительно возвращает 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 не предоставил мне решение, которое работает.

может быть, keepAlive станет ложным?

Scary Wombat 02.05.2018 02:33

Нет, это становится ложным только в onDestroy(). Предположим, что это всегда правда

Victor2748 02.05.2018 02:33

Какую версию ОС используете?

Sagar 02.05.2018 02:34

@Sagar на Android 8.1

Victor2748 02.05.2018 02:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 - это не тот класс, который я могу расширить. Как я могу создать службу переднего плана?

Victor2748 02.05.2018 04:20

Вам необходимо продлить его как обычную услугу. Изменился способ его названия. Вместо того, чтобы звонить startService(), вы позвоните в startForegroundService(), посмотрите этот ТАК

Sagar 02.05.2018 04:22

Другие вопросы по теме