深入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对象。
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思忖小下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值