深入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对象。
相关推荐
Blue.ztl1 小时前
菜鸟之路day31一一MySQL之多表设计
android·数据库·mysql
练习本4 小时前
Android系统架构模式分析
android·java·架构·系统架构
每次的天空9 小时前
Kotlin 内联函数深度解析:从源码到实践优化
android·开发语言·kotlin
练习本9 小时前
Android MVC架构的现代化改造:构建清晰单向数据流
android·架构·mvc
早上好啊! 树哥10 小时前
android studio开发:设置屏幕朝向为竖屏,强制应用的包体始终以竖屏(纵向)展示
android·ide·android studio
YY_pdd10 小时前
使用go开发安卓程序
android·golang
Android 小码峰啊12 小时前
Android Compose 框架物理动画之捕捉动画深入剖析(29)
android·spring
bubiyoushang88812 小时前
深入探索Laravel框架中的Blade模板引擎
android·android studio·laravel
cyy29812 小时前
android 记录应用内存
android·linux·运维
CYRUS STUDIO13 小时前
adb 实用命令汇总
android·adb·命令模式·工具