Преобразование класса в услугу - PullRequest
0 голосов
/ 24 февраля 2020

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

Я подумал о преобразовании в синглтон, чтобы предотвратить это, но потом подумал, что было бы лучше, если бы он работал как служба, чтобы подсчитывать шаги, пока приложение не запущено (думаю, так оно и работает?).

Как лучше всего преобразовать класс в службу, которую я могу добавить в файл манифеста? Мне нужен доступ к контексту приложения, поэтому я не уверен, как это можно передать при запуске из файла манифеста.

public class StepCountingService implements SensorEventListener
{
    private SensorManager sensorManager;

    public StepCountingService(Context context)
    {
        //initialise class
    }

    @Override
    public void onSensorChanged(SensorEvent event)
    {
        //step update logic
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy)
    {

    }
}

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Сервис - это один из вариантов, вам нужно сделать его приоритетным, чтобы Android не убивал ваше приложение, когда пользователь его не использовал. Я ответил на аналогичный вопрос здесь о том, как это сделать:

Как создать постоянный фоновый сервис, который определяет, когда WiFi, Bluetooth и мобильные данные включены и выключены?

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

https://developer.android.com/guide/components/bound-services

Или ваша служба может обновить базу данных (или общий файл настроек), а затем действие может просто запросить базу данных, и вам не нужно будет связываться с этой службой.

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

1 голос
/ 24 февраля 2020

Я бы сделал это Singleton, на самом деле это довольно просто:

Добавить этот код (адаптировать его) в класс.

class count {

    private static count n = null;

    public static count getInstance(){
        if (n == null){
            n = new count();
        }

        return n;
    }

    private count(){
        //constructor
    }
}

В основной файл:

count n = count.getInstance();
...