#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
. Я предполагаю, что они ожидают, что вы проверите документацию, чтобы выяснить, является ли она статической или экземплярной, и вызовете ее соответствующим образом. Лично я стараюсь избегать подобных конструкций в своих работах, чтобы люди не были сбиты с толку, как вы.