这可能是一个非常基本的问题,通常在面试中都会被问到这个问题,但是我无法为此找到合适的明确答案,这就是为什么在这里问
我有一个简单的服务,
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。
我在激活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 OS将创建并准备服务组件以在不同的线程中执行,并且准备就绪时,我们将在主线程中获得onCreate
回调服务。到那时,操作系统将异步进行准备。
对吗?
如果任何人都可以详细说明幕后发生的事情,那将非常有帮助。提前致谢!
答案 0 :(得分:0)
简而言之:在onCreate()
中,调用startService()
只是启动Service
的请求。由于Service
将在主线程上运行,因此其所有方法只能在onCreate()
完成后才能执行。
使用Thread.sleep(5000);
,主线程被onCreate()
阻塞5秒钟。作为该方法的最后一步写入Logcat之后,主线程可以自由运行下一个计划的方法。
有用的链接:Understanding Android Core: Looper, Handler, and HandlerThread