第9章 四大组件的工作过程

9.1 四大组件的运行状态

  1. Activity用于向用户展示界面,可由显式或者隐式Intent来启动。
  2. Service用于在后台执行计算任务,运行在主线程中的,耗时的后台计算仍然需要在单独的线程中去完成。Service组件有两种状态:
    1. 启动状态:不可与外界通信(当然有可以通过广播发送Intent)
    2. 绑定状态。外界可以很方便的和service进行通信
  3. BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息,它工作在系统内部。广播有两种注册方式:
    1. 静态注册: AndroidManifest中注册,在应用安装的时候会被系统解析,这种广播不需要应用启动就可以收到相应的广播。
    2. 动态注册。动态注册需要通过Context.registerReceiver()来注册,这种广播需要应用启动才能注册并接收广播。
  4. ContentProvider用于向其他组件乃至其他应用共享数据。ContentProvider中的insert、delete、update、query方法需要处理好线程同步,因为这几个方法是在Binder线程池中被调用的

9.2 Activity的工作过程

  1. Activity启动的大致流程(从前一个Activity中的startActivity到新的Activity即将建立)


  2. ApplicationThread是ActivityThread的一个内部类,它继承自ApplicationThreadNative,而ApplicationThreadNative继承自Binder并实现了IApplicationThread接口,ApplicationThreadNative的作用其实就和系统为AIDL文件生成的类是一样的。
  3. ActivityManagerService(AMS)继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS也是一个Binder。
  4. 一个应用只有一个Application对象,它的创建也是通过Instrumentation来完成的,这个过程和Activity对象的创建过程一样,都是通过类加载器来实现的。
  5. 在performLaunchActivity这个方法中,完成了5件事情
    1. 获取待启动的Activity
    2. Instrumentation.newActivity()
    3. makeApplication
    4. 创建ContextImpl对象并通过Activity的attach方法完成重要数据初始化。attach方法中,Activity还会完成Window的创建并建立自己和Window的关联。
    5. 调用Activity的onCreate方法

总结:
AMS是system_server提供的一个管理四大组件的重要服务,StartActivity是一个典型的Binder请求过程,ActivityThread是一个应用进程的主线程。

  1. Activity对象作为客户端通过ActivityManagerNative向system_server的AMS发起startActvity的Binder请求
  2. 服务端的AMS调用一系列的方法(主要Activity栈的操作,详细的逻辑也和LauncherMode有关),然后通过客户端(ActivityThread)的Binder——ApplicationThread,让ActivityThread作出performLaunchActivity的操作
  3. ActivityThread->AMS->ActivityThread。如果startActivity的目标是进程内,则前后的ActivityThread是同一个;如果startActvity的目标是进程外,则前后的ActvityThread是不同的。

9.3 Service的工作过程

  1. startServie


  2. bindServie


  3. 同Activity,startService/bindService也是一个ActivityThread->AMS->ActivityThread的Binder过程

9.4 BroadcastReceiver的工作过程

  1. BroadcastReceiver的工作过程包括广播注册过程、广播发送和接收过程。
  2. 注册过程
    1. 动态注册



      动态注册的原理是将Receiver打包成可传输的IIntentReceiver,跨进程向AMS发送注册请求,然后AMS中保存(InnerReceiver和filter)下来即可。

    2. 静态注册
      四大组件在应用安装是会由PMS解析并注册,静态注册的广播也是这时候注册的。
  3. 发送和接收过程


  4. 广播的发送有几种类型:
    1. 普通广播
    2. 有序广播:按优先级的不同,优先Receiver可对数据进行处理,并传给下一个Receiver。
  5. 5.0后,默认情况下广播不会发送给已经停止的应用

9.5 ContentProvider的工作过程

  1. ContentProvider的启动过程伴随着Application的启动过程:
    1. 当一个应用启动时,入口方法是ActivityThread的main方法,其中创建ActivityThread的实例并创建主线程的消息队列;
    2. ActivityThread的attach方法中会远程调用ActivityManagerService的attachApplication,并将ApplicationThread提供给AMS,ApplicationThread主要用于ActivityThread和AMS之间的通信;
    3. ActivityManagerService的attachApplication会调用ApplicationThread的bindApplication方法,这个方法会通过H切换到ActivityThread中去执行,即调用handleBindApplication方法;
      4.handleBindApplication方法会创建Application对象并加载ContentProvider,注意是先加载ContentProvider,然后调用Application的onCreate方法。
  2. ContentProvider的android:multiprocess属性决定它是否是单实例,默认值是false,也就是默认是单实例。当设置为true时,每个调用者的进程中都存在一个ContentProvider对象。
  3. 当调用ContentProvider的insert、delete、update、query方法中的任何一个时,如果ContentProvider所在的进程没有启动的话,那么就会触发ContentProvider的创建,并伴随着ContentProvider所在进程的启动。
  4. ContentProvider query的流程


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容