Отличный пример сервиса ставит меня в тупик

#android #service

#Android #Обслуживание

Вопрос:

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

     import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.util.Log;

    public class TestService1 extends Service {
        private static final String TAG = "TestService1";

        @Override
        public void onCreate() {
            Log.d(TAG, "onCreate");
            super.onCreate();
        }

        @Override
        public IBinder onBind(Intent intent) {
            Log.d(TAG, "onBind");
            return null;
        }
     }
  

Я также добавил запись определения сервиса как дочернюю для:

     <application> in my AndroidManifest.xml as follows:

    <service android:name="TestService1"></service>
  

Затем в книге говорится: «Следующий очевидный вопрос заключается в том, как вызвать службу?»

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

Это просто экспериментально, и я просто хочу увидеть запуск службы и сообщения журнала в logcat. В книге говорится: «Система вызывает onCreate() при первом создании сервиса, но перед вызовом OnStart(). Этот процесс, который напоминает процесс создания действия, предоставляет службе возможность выполнять одноразовую инициализацию при запуске.»

Ну, хорошо, но я не уверен, что делать для запуска сервиса, за исключением, возможно, того, что в onCreate () моего основного действия сделайте что-то вроде:

     Intent TestService1 = new Intent(this,com.mydomain.myproject.TestService1.class);
    startActivity(TestService1);
  

Но когда я делаю это, я получаю сообщение об ошибке: «Приложение… неожиданно прекратилось.»

Я думаю, что у этой проблемы есть простое решение, но я просто слишком прост, чтобы увидеть это 🙂

Ответ №1:

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

Комментарии:

1. @Anomie спасибо, что избавился от ошибки, но почему я не вижу сообщения журнала в logcat, по крайней мере, из метода onCreate () службы? Упс, теперь я это вижу. Это было там с самого начала. Спасибо.

2. @Anomie в «Pro Android 2» я нашел, где говорится, как запустить поток: Context.startService(). И я нашел developer.android.com/reference/android/app/Service.html где также указано Context.startService() тоже. Но оба выдают следующую ошибку компиляции: «Не удается создать статическую ссылку на нестатический метод startService(Intent) из контекста типа». Но startService () работает нормально. Почему такая запутанная документация?

3. @Marie: Когда вы говорите Context.startService , вы пытаетесь вызвать статический (то есть классовый) метод с именем startService . Когда вы говорите «просто», startService вы неявно вызываете this.startService , который вызывает метод экземпляра.

4. @Anomie Я не понимаю, почему оба вышеприведенных источника документации продвигают Context.startService() как способ запуска сервиса. Как «Pro Android 2», так и developer.android.com/reference/android/app/Service.html продвигайте Context.startService() как способ запуска сервиса. Почему? Как я собираюсь добиться прогресса с использованием сервисов, если документация неверна? Прежде чем я отойду от темы, должен ли я задать новый вопрос о документации?

5. @Marie: В нем говорится, что вам следует использовать startService метод, объявленный в классе Context; в противном случае вам может быть интересно, где его найти startService . Я предполагаю, что они ожидают, что вы проверите документацию, чтобы выяснить, является ли она статической или экземплярной, и вызовете ее соответствующим образом. Лично я стараюсь избегать подобных конструкций в своих работах, чтобы люди не были сбиты с толку, как вы.