• Activity的主要作用是展示一个界面并和用户交互,它扮演的是一种前台界面的角色。
  • Service是一种计算型组件,用于在后台执行一系列计算任务。Service有两种状态:启动状态和绑定状态。启动状态时的Service不需要与外界交互,绑定状态的Service可以方便的和Service组件进行通信。Service是运行在主线程中的,因此耗时的后台计算仍然需要在单独的线程中去完成。灵活采用stopService和unBindService这两个方法才能完全停止一个Service组件。
  • BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。广播注册有静态和动态两种方式,动态注册通过Context.registerReceiver()来实现,不需要时通过Contex.unRegisterReceiver()来解除广播,这种方式必须要应用启动才能注册;静态注册则在AndroidManifest文件中进行,应用安装时会被系统解析,不需要启动应用就可接收广播。匹配过程是通过来描述的。
  • ContentProvider是一种共享型组件,用于向其他组件乃至其他应用共享数据。它内部维持着一份数据集合,并需要实现增删改查这四种操作,这个数据集合既可以通过数据库来实现,也可以采用其他类型来实现,比如List,Map等。需要注意的是,增删改查要处理好线程同步,这几个方法是在Binder线程池中被调用的,另外,ContentProvider不需要手动停止。

Activity的工作过程

注

  • 启动Activity的真实实现是由ActivityManagerNative.getDefault().startActivity方法来完成的。这个方法返回ActivityManagerService。
  • ActivityManagerService(AMS)继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS也是一个Binder。
  • AMS这个Binder对象采用单例模式对外提供,第一次调用它的get方法时会通过create方法初始化,后续调用中直接返回之前创建的对象。
  • 从makeApplication的实现可以看出,如果Application已经被创建过了,那么就不会再重复创建,这也意味着一个应用只有一个Application对象。Application的创建也是通过Instrumentation来完成的,这个过程和Activity对象的创建过程一样,都是通过类加载器来实现的。
  • ContextImpl是Context的具体实现,ContextImpl是通过Activity的attach方法来和Activity建立关联的,在attach方法中Activity还会完成Window的创建并建立自己和Window的关联,这样当Activity接受到事件就可以传递给window了。

Service的工作过程

启动过程

绑定过程

注

  • Service有两种状态:启动状态和绑定状态,两种状态是可以共存的。

BroadcastReceiver的工作过程

BroadcastReceiver的工作过程包括广播注册过程、广播发送和接收过程。

动态注册

发送和接收

注:

  • 静态注册是由PackageManagerService(PMS)在应用安装的时候完成整个注册过程的,除广播以外,其他三大组件也都是在应用安装时由PMS解析并注册的。
  • 广播的发送有几种类型:普通广播、有序广播和粘性广播,有序广播和粘性广播与普通广播相比具有不同的特性,但是发送和接收过程是类似的。
  • FLAG_INCLUDE_STOPPED_PACKAGES:广播会发送给已经停止的应用,FLAG_EXCLUDE_STOPPED_PACKAGES广播不会发送给已经停止的应用
  • 从Android 3.1开始,处于停止状态的应用无法接受到开机广播。

ContentProvider

启动过程

  • 当ContentProvider所在的进程启动时,会同时被启动并被发布到AMS中,需要注意的是,这个时候它的onCreate要先去Application的onCreate执行,这在四大组件中是一个少有的现象。
  • 用启动的入口为ActivityThread的main方法,main方法会创建ActivityThread实例并创建主线程消息队列。
  • attach方法中远程调用AMS的attachApplication方法,并提供ApplicationThread用于和AMS的通信。
  • attachApplication方法会通过bindApplication方法和H来调回ActivityThread的handleBindApplication,这个方法会先创建Application,再加载ContentProvider,然后才会回调Application的onCreate方法。
  • ContentProvider的multiprocess属性决定了ContentProvider是否是单例(false时),一般都用单例。
  • ontentResolver的具体类是ApplicationContentResolver,当ContentProvider所在进程未启动时,第一次访问它会触发ContentProvider的创建以及进程启动。

Query流程

insert,delete和update方法类似,这里就不在分析了。

[Android]四大组件的运行状态的更多相关文章

  1. android四大组件(简单总结)

    activity 一个Activity通常就是一个单独的屏幕(窗口) Activity之间通过Intent进行通信 android应用中每一个Activity都必须要在AndroidManifest. ...

  2. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  3. Android四大组件小结

    Android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...

  4. Android四大组件——Activity

    Activity作为Android四大组件之一,也是其中最重要的一个组件.作为一个与用户交互的组件,我们可以把Activity比较成为windows系统上的一个文件夹窗口,是一个与用户交互的界面.再进 ...

  5. Android四大组件(详细总结)

    android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...

  6. Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)

    什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...

  7. Android四大组件之一 -- Service详解

    相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序 ...

  8. Android——四大组件、六大布局、五大存储

    一.android四大组件 (一)android四大组件详解 Android四大组件分别为activity.service.content provider.broadcast receiver. 1 ...

  9. 入职小白随笔之Android四大组件——服务(Service)

    Service Android多线程编程 当我们在程序中执行一些耗时操作时,比如发起一条网络请求,考虑到网速等原因,服务器未必会立刻响应我们的请求,此时我们就需要将这些操作放在子线程中去运行,以防止主 ...

随机推荐

  1. VLAN虚拟局域网技术(二)-计算机网络

    本文主要知识来源于学校课程,部分知识来自于H3C及思科中国公司网页技术手册,未经许可,禁止转载.如需转载,请联系作者并注明出处. 本节主要是总结一些思科的VLAN组中的私有协议:DTP和VTP. 1. ...

  2. 创建Django博客的数据库模型

    声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 blog最主要的功能就是展示我们写的文章 ...

  3. mysql七:视图、触发器、事务、存储过程、函数

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...

  4. 2018.3.3 How too much fructose may cause liver damage

    Fructose is the sweetest of the natural sugars. As its name suggests, it is found mainly in fruits. ...

  5. ACM学习历程——UVA540 Team Queue(队列,map:Hash)

    Description   Team Queue   Team Queue  Queues and Priority Queues are data structures which are know ...

  6. windows下搭建绿色nodejs运行环境

    无意中在网上看到NodeJS的文章,发现最近还挺火的,正好我也是做技术的,那就下载个玩玩呗,试试它的魅力,也来亲自感受下. 网上nodejs的环境的搭建到处都是,我这里就不说了,今天我想通过我自己的环 ...

  7. 理解I/O Completion Port(完成端口)

    欢迎阅读此篇IOCP教程.我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼.OK,但我不能保证你明白IOCP的一切,但我会尽我 ...

  8. kindle3 破解字体

    在万能的链接里下载kindle-fonts-4.4.N-k3.zip,update后kindle里出现linkfonts/fonts,这里就是存放字体的位置,字体格式需用.ttf. 在linkfont ...

  9. Selenium Webdriver元素定位

    http://www.cnblogs.com/qingchunjun/p/4208159.html

  10. window下redis如何查看版本号

    1.启动服务端:redis-server 2.启动客户端:redis-cli 3.客户端输入:info 即可.