Фоновая служба иногда падает - PullRequest
0 голосов
/ 27 мая 2018

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

enter image description here

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        context = getApplicationContext();

        handler = new Handler();
        handler.removeCallbacks(restartThread);
        handler.post(restartThread);
        return START_STICKY;
    }

    private Runnable restartThread = new Runnable() {
        @Override
        public void run() {
            handler.postDelayed(restartThread, NOTIFY_INTERVAL);
        }
    };

Возможно ли, что ОС убивает фоновую службу из-за нехватки памяти?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Скорее всего, существует множество проблем с этой реализацией.Фоновые службы заблокированы в современных версиях Android, и даже в старых версиях, где запущен такой сервис (с циклом Runnable), очень часто возникают ошибки.

Начиная с 2018 года, лучший способ запустить запланированное заданиеиспользовать библиотеку WorkManager из компонентов архитектуры Android.

WorkManager выбирает подходящий способ планирования фоновой задачи - в зависимости от уровня API устройства и включенных зависимостей, WorkManager может использовать JobScheduler, Firebase JobDispatcher или AlarmManager.Вам не нужно писать логику устройства, чтобы выяснить, какими возможностями обладает устройство, и выбрать соответствующий API;вместо этого вы можете просто передать свою задачу в WorkManager и позволить ему выбрать лучший вариант.

https://developer.android.com/topic/libraries/architecture/workmanager

Вы можете определить задачу следующим образом

public class CustomWorker extends Worker {
  ...
}

и затем запланируйте это следующим образом

new PeriodicWorkRequest.Builder photoWorkBuilder =
        new PeriodicWorkRequest.Builder(CustomWorker.class, 12,
                TimeUnit.HOURS);
// ...if you want, you can apply constraints to the builder here...

// Create the actual work object:
PeriodicWorkRequest work = customWorkerBuilder.build();
// Then enqueue the recurring task:
WorkManager.getInstance().enqueue(work);
0 голосов
/ 27 мая 2018

Это всего лишь предложение, а не решение вашей проблемы

Возможно, лучше использовать JobService , а не фоновую службу.У них так много ограничений на фоновые сервисы из Android Oreo и выше

...