как создать ПОСТОЯННУЮ фоновую службу на андроиде

Мне снится кошмар, когда я пытаюсь создать простую фоновую службу на Android, которая работает постоянно.

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

но этого не происходит

это мой манифест:

<service
        android:name=".service.MyService"
        android:description="@string/serviceDescription"
        android:directBootAware="false"
        android:enabled="true"
        android:exported="false"
        android:icon="@drawable/ic_logo"
        android:label="@string/serviceLabel"/>

Я начинаю службу Application onCreate()

    if (MyService.getInstance() == null) {
        Intent intent = new Intent(this, MyService.class);
        startService(intent);
    }

услуга:

public void onCreate() {
        super.onCreate();
        this.workDone = 0;

        this.workerMap = new HashMap<User.UserData, Worker>(3);
        this.listeners = new HashMap<Worker, Worker.WorkerListener>(3);
        this.usernames = new HashMap<APIFacade, List<String>>(3);

        this.threadPool = Executors.newFixedThreadPool(3);
        INSTANCE = this;

    }

АБСОЛЮТНО НИГДЕ В МОЕМ КОДЕ Я НЕ НАЗЫВАЮ STOPSERVICE И STOPSELF

так почему я получаю исключение nullpointerexception в некоторых случайных ситуациях?

кто-то даже сказал мне сделать следующий код, чтобы заставить Android «перезапустить» службу

  @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

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

у моего приложения более 1000 пользователей в день, и около 10% из них «находят способ» сделать исключение нулевого указателя при использовании сервиса.


person Rafael Lima    schedule 13.12.2018    source источник
comment
Возможный дубликат Android — реализация startForeground для службы?   -  person TheWanderer    schedule 14.12.2018
comment
Не создавайте постоянную службу, которая продолжает опрос. Используйте push-уведомления. Экономит циклы ЦП, трафик данных, заряд батареи и т. д. Лучший опыт для всех.   -  person J.A.P    schedule 14.12.2018
comment
Возможный дубликат постоянных служб на android oreo   -  person nandsito    schedule 14.12.2018
comment
@ J.A.P, если API позволяет мне нажимать, я бы ... так как это сторонний API, и я не могу изменить поведение бэкэнда, я должен опросить   -  person Rafael Lima    schedule 14.12.2018
comment
@RafaelLima Я знаю, но у вас может быть собственный сервер для обработки уведомлений. То есть посредник.   -  person J.A.P    schedule 14.12.2018
comment
Я не понимаю, почему людям нравится минусовать ... это аутентичный вопрос, он хорошо написан и, как было правильно указано. это функция более новых версий Android. Никто не знает обо всех аспектах всех версий Android, и пока некоторые люди не указали, я не заметил, что ошибки исходят из версии 8.0 ‹   -  person Rafael Lima    schedule 14.12.2018


Ответы (2)


Многие внутренние компоненты фоновых служб изменились в Oreo (или это была Nougat?). Я бы ознакомился с документацией Android:

https://developer.android.com/about/versions/oreo/background

и

https://developer.android.com/training/best-background

Возможно, вы захотите рассмотреть структуру JobScheduler.

person Cody Caughlan    schedule 13.12.2018
comment
он говорит: Служба переднего плана выполняет некоторую операцию, заметную для пользователя. ... Службы переднего плана должны отображать уведомление. но не сказано, как их создавать... нужно ли мне что-то указывать в моем намерении? проявляется? или просто тот факт, что в моем приложении есть видимое уведомление, делает все мои службы приоритетными ??? - person Rafael Lima; 14.12.2018
comment
У меня последний вопрос... мне нужно сделать startForeground() в onCreate() моего сервиса или я могу сделать где-то еще в коде - person Rafael Lima; 14.12.2018

Ответ: Вы не можете! Текущий Android на 100 % блокирует предоставление разработчикам постоянных услуг.
Раньше было возможно (но не совсем надежно) делать это с помощью KitKat.

Самое близкое, что вы можете получить от постоянной службы, — это использовать службу переднего плана с помощью метод startForeground() из службы и метод startServiceForeground() (в API 26 и выше) при запуске службы.
Но даже в этом случае служба все равно будет убита в некоторых случаях. точка.

Альтернативы:

  • Используйте WorkManager для выполнения задач «время от времени» (звучит как жизнеспособный вариант из того, что вы описываете)
  • Пользователь AlarmManager для выполнения задачи в определенное время
  • Пользователь FCM (push-сообщения) для выполнения задач, выполняемых по указанию сервера.
person Budius    schedule 13.12.2018