第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即将建立)


    第9章 四大组件的工作过程_第1张图片
  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


    第9章 四大组件的工作过程_第2张图片
  2. bindServie


    第9章 四大组件的工作过程_第3张图片
  3. 同Activity,startService/bindService也是一个ActivityThread->AMS->ActivityThread的Binder过程

9.4 BroadcastReceiver的工作过程

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


      第9章 四大组件的工作过程_第4张图片

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

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


    第9章 四大组件的工作过程_第5张图片
  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的流程


    第9章 四大组件的工作过程_第6张图片

你可能感兴趣的:(第9章 四大组件的工作过程)