深入Android架构(从线程到AIDL)_09 认识Android的主线程

目录

UI线程的诞生

[練習: 绑定(Bind)远程的Service](#練習: 绑定(Bind)远程的Service)


UI线程的诞生
  • 当我们启动某一支AP时, Android就会诞生新进程(Process),并且将该AP程序加载这新诞生的进程里。每个进程在其诞生时刻,都会诞生一个主线程,又称为UI线程。

  • 在进程诞生时刻,除了诞生主线程之外,还会替主线程诞生它专用的Message Queue和Looper。如下图所示:

  • 这个Main Looper就是让主线程没事时就来执行Looper,确保主线程永远活着而不会死掉;在执行Looper时,会持续观察它的Message Queue是否有新的信息进来;如果有新信息进来的话,主线程就会尽快去处理(响应)它。

  • 在Android环境里,一个应用程序常包含有许多个类别,这些类别可以分布在不同进程里执行,或挤在一个进程里执行。例如有一个应用程序的AndroidManifest.xml文件内容如下:

    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对象。
相关推荐
江上清风山间明月2 小时前
Flutter开发的应用页面非常多时如何高效管理路由
android·flutter·路由·页面管理·routes·ongenerateroute
子非衣5 小时前
MySQL修改JSON格式数据示例
android·mysql·json
openinstall全渠道统计9 小时前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
双鱼大猫9 小时前
一句话说透Android里面的ServiceManager的注册服务
android
双鱼大猫9 小时前
一句话说透Android里面的查找服务
android
双鱼大猫9 小时前
一句话说透Android里面的SystemServer进程的作用
android
双鱼大猫9 小时前
一句话说透Android里面的View的绘制流程和实现原理
android
双鱼大猫10 小时前
一句话说透Android里面的Window的内部机制
android
双鱼大猫10 小时前
一句话说透Android里面的为什么要设计Window?
android
双鱼大猫10 小时前
一句话说透Android里面的主线程创建时机,frameworks层面分析
android