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

9.1 四大组件的运行状态

(1)四大组件中只有BroadcastReceiver既可以在AndroidManifest文件中注册,也可以在代码中注册,其他三个组件都必须在AndroidManifest文件中注册;ContentProvider的调用不需要借助Intent,其他三个组件都需要借助Intent。
(2)Activity是一种展示型组件,用于向用户展示界面,可由显式或者隐式Intent来启动。
(3)Service是一种计算型组件,用于在后台执行计算任务。尽管service是用于后台执行计算的,但是它本身是运行在主线程中的,因此耗时的后台计算仍然需要在单独的线程中去完成。Service组件有两种状态:启动状态和绑定状态。当service处于绑定状态时,外界可以很方便的和service进行通信,而在启动状态中是不可与外界通信的。
(4)BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息,它工作在系统内部。广播有两种注册方式:静态注册和动态注册。静态注册是在AndroidManifest中注册,在应用安装的时候会被系统解析,这种广播不需要应用启动就可以收到相应的广播。动态注册需要通过Context.registerReceiver()来注册,这种广播需要应用启动才能注册并接收广播。BroadcastReceiver组件一般来说不需要停止,它也没有停止的概念。
(5)ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。ContentProvider中的insertdeleteupdatequery方法需要处理好线程同步,因为这几个方法是在Binder线程池中被调用的,另外ContentProvider组件也不需要手动停止。

[下面对四大组件的工作过程的总结需要感谢amurocrash童鞋的读书笔记以及他细心制作的UML图,帮助我从原书复杂的方法调用中跳出来看到整体的大致流程]

9.2 Activity的工作过程

(1)Activity启动的大致流程

(2)ApplicationThreadActivityThread的一个内部类,它继承自ApplicationThreadNative,而ApplicationThreadNative继承自Binder并实现了IApplicationThread接口,ApplicationThreadNative的作用其实就和系统为AIDL文件生成的类是一样的。
(3)ActivityManagerService(AMS)继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS也是一个Binder。
(4)一个应用只有一个Application对象,它的创建也是通过Instrumentation来完成的,这个过程和Activity对象的创建过程一样,都是通过类加载器来实现的。
(5)ContextImpl是Context的具体实现,ContextImpl是通过Activity的attach方法来和Activity建立关联的,在attach方法中Activity还会完成Window的创建并建立自己和Window的关联,这样当window接收到外部输入事件后就可以将事件传递给Activity。 [这里可能有误,应该是Activity将事件传递给window]

9.3 Service的工作过程

(1)Service有两种状态:启动状态和绑定状态,两种状态是可以共存的。
启动过程:

绑定过程:

9.4 BroadcastReceiver的工作过程

(1)BroadcastReceiver的工作过程包括广播注册过程、广播发送和接收过程。
注册过程:静态注册的时候是由PackageManagerService来完成整个注册过程,下面是动态注册的过程

发送和接收过程:

(2)广播的发送有几种类型:普通广播、有序广播和粘性广播,有序广播和粘性广播与普通广播相比具有不同的特性,但是发送和接收过程是类似的。
(3)一个应用处于停止状态分为两种情况:一是应用安装后未运行;二是应用被手动或者其他应用强停了。从Android 3.1开始,处于停止状态的应用无法接受到开机广播。

9.5 ContentProvider的工作过程

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

详细的过程分析建议阅读原书,简直精彩!

其他学习资料
1.Android开发艺术探索读书笔记(三)

OK,本章结束,谢谢阅读。

《Android开发艺术探索》读书笔记 (9) 第9章 四大组件的工作过程的更多相关文章

  1. Android开发艺术探索读书笔记——01 Activity的生命周期

    http://www.cnblogs.com/csonezp/p/5121142.html 新买了一本书,<Android开发艺术探索>.这本书算是一本进阶书籍,适合有一定安卓开发基础,做 ...

  2. Android开发艺术探索读书笔记——进程间通信

    1. 多进程使用场景 1) 应用某些模块由于特殊需求须要执行在单独进程中. 如消息推送,使消息推送进程与应用进程能单独存活,消息推送进程不会由于应用程序进程crash而受影响. 2) 为加大一个应用可 ...

  3. android开发艺术探索读书笔记之-------view的事件分发机制

    View的点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程. 分发过程主要由以下 ...

  4. Android开发艺术探索学习笔记(三)

    第三章  View的事件体系 3.1 View基础知识 3.1.1 什么是view View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件. 3.1.2 View的 ...

  5. Android开发艺术探索学习笔记(十一)

    第十一章  Android的线程和线程池 从用途上来说,线程分为子线程和主线程,主线程主要处理和界面相关的事情,而子线程往往用于执行耗时的操作.AsyncTask,IntentService,Hand ...

  6. Android开发艺术探索学习笔记(一)

    第一章 Activity的生命周期和启动模式 1.1Activity的生命周期全面解析 1.1.1典型情况下的生命周期分析 (1)在两个Activity进行切换时,当前的Activity的onPaus ...

  7. Android开发艺术探索学习笔记(十)

    第十章  Android的消息机制 面试中经常会被问到的一个问题:handler是如何在子线程和主线程中进行消息的传递的,这个问题通过了解Android的消息机制可以得到一个准确的答案. Androi ...

  8. Android开发艺术探索学习笔记(六)

    第六章 Android的Drawable  Drawable的优点:使用简单,比自定义view的成本要低:非图片类型的Drawable占用空间小,有利于减小APK安装包的大小. 6.1Drawable ...

  9. Android开发艺术探索学习笔记(四)

    第四章 View的工作原理 4.1初识ViewRoot和DecorView ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成 ...

随机推荐

  1. php之利用递归写无限极分类

    <?php //无限极分类 //parent 的值,是该栏目的父栏目的id 反之是 /*0 安徽 合肥 北京 海淀 中关村 上地 河北 石家庄 */ $area = array( array(' ...

  2. 技术大牛面试 http://www.itmian4.com/forum.php?mod=viewthread&tid=3824

    不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...

  3. python进度条代码

    import sys import time def view_bar(num,total): rate = num / total rate_num = int(rate * 100) r = ' ...

  4. java高精度数组

    POJ1205 递推公式为a[i] = 3*a[i-1] - a[i-2], a[1] = 1,a[2] = 3 , i 最高为100; 搞懂了使用BigInteger开数组. import java ...

  5. ubuntu下使用C语言开发一个cgi程序

    主要步骤是: 1. 开发一个C程序(在标准输出中输出HTML字符串) 2. 复制到apache2的cgi-bin目录去 3. 在httpd.conf中开启cgi功能(我似乎没用到,也可以使用cgi) ...

  6. oracle 查询dblink的方法

    oracle 查询dblink的方法: SYSDBA登录, sys登录 SELECT * FROM SYS.link$;

  7. Apache Maven 入门篇(下)

    第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点接触后,接下去的一步是要了解maven的核心概念,这样才能在使用maven的时 ...

  8. SharePoint 软件边界及限制

    摘自technet http://technet.microsoft.com/zh-cn/library/cc262787.aspx

  9. keil MDK启动文件分析---基于LPC2100系列(其实都是相通的)

    转用MDK有一段时间了,越来越觉得MDK的强大,因为我之前都是用ADS1.2开发产品,所以更能体会到MDK的强大与易用性.MDK编译出来的代码与ADS1.2相比,代码量减少了很多,我的一个工程用ADS ...

  10. Unity笔记

    1.使某个对象上的脚本失效和生效: GameObject.Find("xxx").transform.GetComponent<xxx>().enabled = fal ...