Это может быть очень простой вопрос, и часто мне задавали этот вопрос в интервью и все такое, но я не могу найти правильный четкий ответ для этого, поэтому спрашиваю здесь
У меня есть простой сервис следующим образом
public class MyService extends Service {
private static final String TAG = "MyService";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
for (int i = 0; i < 10; i++) {
Log.d(TAG, "onStartCommand: " + i + " in " + Thread.currentThread().getName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return START_NOT_STICKY;
}
}
Служба печатает с 1 по 10 с небольшой задержкой.
И у меня есть этот код в Activate onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this, MyService.class)); // starting the service
try {
Thread.sleep(5000); // waiting for 5 seconds after service started
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "onCreate completed");
}
Поскольку я использовал обычную службу, она выполняется в главном потоке, где выполняется ваша деятельность.
Таким образом, в идеале он должен сначала выполнить служебный код и, наконец, вывести "onCreate completed"
, который является последней строкой в onCreate
, поскольку у нас есть только один поток, чтобы выполнить все эти
Но во время бега я вижу, что:
// here is a delay of 5 seconds and after that the following prints
onCreate: completed
onStartCommand: 0 in main
onStartCommand: 1 in main
onStartCommand: 2 in main
onStartCommand: 3 in main
onStartCommand: 4 in main
onStartCommand: 5 in main
onStartCommand: 6 in main
onStartCommand: 7 in main
onStartCommand: 8 in main
onStartCommand: 9 in main
Как видите, даже если я сначала запускаю службу, а потом ставлю задержку, onCreate finishes
сначала выполнение.
Тогда только служба запускает выполнение в главном потоке. Почему это так?
Насколько я понимаю, ОС Android создаст и подготовит компонент службы для выполнения в другом потоке, и когда он будет готов, мы получим обратный вызов onCreate
в основном потоке. До этого ОС готовится в асинхронном режиме.
Это правильно?
Если бы кто-нибудь мог дать подробное объяснение того, что происходит за кулисами, это было бы очень полезно. Заранее спасибо!