深入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对象。
相关推荐
whysqwhw3 小时前
安卓图片性能优化技巧
android
风往哪边走3 小时前
自定义底部筛选弹框
android
Yyyy4824 小时前
MyCAT基础概念
android
Android轮子哥4 小时前
尝试解决 Android 适配最后一公里
android
雨白6 小时前
OkHttp 源码解析:enqueue 非同步流程与 Dispatcher 调度
android
风往哪边走6 小时前
自定义仿日历组件弹框
android
没有了遇见6 小时前
Android 外接 U 盘开发实战:从权限到文件复制
android
Monkey-旭7 小时前
Android 文件存储机制全解析
android·文件存储·kolin
zhangphil8 小时前
Android Coil 3拦截器Interceptor计算单次请求耗时,Kotlin
android·kotlin
DokiDoki之父8 小时前
多线程—飞机大战排行榜功能(2.0版本)
android·java·开发语言