深入Android架构(从线程到AIDL)_09 认识Android的主线程
目录
UI线程的诞生
練習: 绑定(Bind)远程的Service
UI线程的诞生
- 当我们启动某一支AP时, Android就会诞生新进程(Process),并且将该AP程序加载这新诞生的进程里。每个进程在其诞生时刻,都会诞生一个主线程,又称为UI线程。
- 在进程诞生时刻,除了诞生主线程之外,还会替主线程诞生它专用的Message Queue和Looper。如下图所示:
- 这个Main Looper就是让主线程没事时就来执行Looper,确保主线程永远活着而不会死掉;在执行Looper时,会持续观察它的Message Queue是否有新的信息进来;如果有新信息进来的话,主线程就会尽快去处理(响应)它。
- 在Android环境里,一个应用程序常包含有许多个类别,这些类别可以分布在不同进程里执行,或挤在一个进程里执行。例如有一个应用程序的AndroidManifest.xml文件内容如下:
// AndroidManifest.xml // ……… <activity android:name=".FirstActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoadActivity"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <service android:name=".LoadService" android:process=":remote"> <intent-filter> <action android:name="com.misoo.pkm.REMOTE_SERVICE" /> </intent-filter> </service> </application> </manifest>
-
Android依据这个文件而将各类别布署于两个进程里执行,如图:
- 其中, FirstActivity和LoadActivity两个类别会加载预设的进程里。而LoadService则会加载于名为“remote” 的独立进程里。
- 于是,由进程#1的主线程去执行FirstActivity和LoadActivity的onCreate()等函数。而由进程#2的主线程去执行LoadService的onCreate()等函数。
- LoadService在独立的进程(名称叫“remote”)里执行。于是, FirstActivity与LoadService之间就属于跨进程的沟通了。这种跨进程的沟通,就是大家熟知的IPC(Inter-Process Communication)机制了。这种IPC机制是透过底层驱动(Driver)来实现的。如下图:
- 在 此 图 的 不 同 进 程 里 , 各 有 其 主 线 程(Thread)。 由于线程是不能越过进程边界的。
所以, 当执行LoadActivity的线程必须跨越进 程 去 执 行 LoadService( 的 函 数 ) 时 ,Android 的 内 层 Binder System 即 刻 从LoadService所在进程的线程池启动线程
(BinderThread) 来 配 合 接 力 , 由 此BinderThread去执行LoadService。
練習: 绑定(Bind)远程的Service
请问:哪一个线程去执行下图的Service类呢?
请问:哪一个线程去执行下图的Service类呢?
- Binder System會從進程的線程池(Thread pool)裡啟動一個線程來執行Binder::onTransact()函數。
请问:下图里各线程的关系是什么呢
- 当Thread_a必须跨越进程去执行JavaBBinder对象时, Android的内层Binder System即刻从myService所在进程的线程池启动线程Thread_x来配合衔接Thread_a线程,由Thread_x去执行JavaBBinder对象。
- Android的每一个进程里,通常含有一个线程池,让跨进程的线程得以进行。虽然是由Thread_a与Thread_x相互合作与衔接而完成远距通讯的,但让人们能单纯地认为是单一进程(即Thread_a)跨越到另一个进程去执行JavaBBinder对象。虽然JavaBBinder是C/C++层级的;而myService是Java层级的,两者不同语言,但处于同一个进程,所以Thread_x可以执
行到myService对象。