Структура класса обслуживания в Android - вопросы и проверка работы - PullRequest
0 голосов
/ 15 января 2019

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

- Нужно ли вручную добавлять этот метод "onStartCommand", чтобы он содержал мой сервисный код?

- Если нет, то где именно мой код будет идти? Похоже, в коде моего «старого» проекта я полностью комментирую, блокирую общедоступный TimerService и передаю null в IBinder, вместо этого создаю onStartCommand и т. Д., И я не могу понять, почему.

- Пока я здесь, кто-нибудь может перепроверить мой код CountdownTimer ниже? и если это правильно, я должен положить его внутри потока?


Когда я создаю новый класс обслуживания, он выглядит так:

public class TimerService extends Service {

    public TimerService() {

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");

    }

}


Однако в моем старом проекте мой класс обслуживания выглядит так:

public class TimerService extends Service {

/*
public TimerService() {

}
*/

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public int onStartCommand(final Intent intent, int flags, int startId) {

    intent.getStringExtra("TIMER_VALUE");

    String string_timerValue;
    string_timerValue = intent.getStringExtra("TIMER_VALUE");

    long long_timerValue;
    long_timerValue = Long.parseLong(String.valueOf(string_timerValue));

    // I DO NOT WANT ANY TICK VALUE, SO GIVE IT FULL TIMER VALUE
    long long_tickValue;
    long_tickValue = Long.parseLong(String.valueOf(string_timerValue));

    new CountDownTimer(long_timerValue, long_tickValue) {

        public void onTick(long millisUntilFinished) {
            // DO NOTHING
        }

        public void onFinish() {

            Toast.makeText(TimerService.this, "TIMES UP", Toast.LENGTH_LONG).show();

            stopService(intent);

        }
    }.start();

    return START_STICKY;

    // END OF onStartCommand
}

@Override
public void onDestroy() {
    super.onDestroy();

    Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}

// END OF ENTIRE SERVICE CLASS
}


СПАСИБО !!

1 Ответ

0 голосов
/ 16 января 2019

Нужно ли вручную добавлять этот метод "onStartCommand", чтобы он содержал мой сервисный код?

Да.

Может кто-нибудь перепроверить мой код CountdownTimer ниже?

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

Помимо этого:

  • Используйте stopSelf(), а не stopService(), чтобы остановить службу внутри этой службы.

  • Изучение Intent дополнений и с использованием START_STICKY не является хорошей комбинацией. START_STICKY говорит: «Если вы завершите мой процесс, чтобы освободить системную память, пожалуйста, перезапустите мой сервис, когда это возможно, но передайте null для Intent». Это приведет к сбою службы с NullPointerException.

...