为什么Android Service和Activity在主线程中异步执行

时间:2019-01-25 12:28:11

标签: android multithreading service android-service

这可能是一个非常基本的问题,通常在面试中都会被问到这个问题,但是我无法为此找到合适的明确答案,这就是为什么在这里问

我有一个简单的服务,

    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回调服务。到那时,操作系统将异步进行准备。

对吗?

如果任何人都可以详细说明幕后发生的事情,那将非常有帮助。提前致谢!

1 个答案:

答案 0 :(得分:0)

简而言之:在onCreate()中,调用startService()只是启动Service的请求。由于Service将在主线程上运行,因此其所有方法只能在onCreate()完成后才能执行。

使用Thread.sleep(5000);,主线程被onCreate()阻塞5秒钟。作为该方法的最后一步写入Logcat之后,主线程可以自由运行下一个计划的方法。

有用的链接:Understanding Android Core: Looper, Handler, and HandlerThread