第九章:四大组件的工作过程

Posted JingQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九章:四大组件的工作过程相关的知识,希望对你有一定的参考价值。

    9.1 四大组件的运行状态

      android的四大组件中除了BroadcastReceiver意外,其他三种组件都必须在AndroidManifest中注册.

      在调用方式上,Activity,Service和BroadcastReceiver需要借助Intent,而ContentProvider则无须借助Intent.

      Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接收用户的输入信息从而进行交互.

      Service是一种计算型组件,用于在后台执行一系列计算任务,需要灵活采用stopService和unBindService这两个方法才能完全停止一个Service组件.

      BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息.

    9.2 Activity的工作过程

      startActivity方法有好几种重载方式,但它们最终都会调用startActivityForResult方法.

      ApplicationThread是ActivityThread的一个内部类,在Activity的启动过程中发挥着很重要的作用.

      在ActivityManagerNative中,AMS这个Binder对象采用单例模式对外提供,Singleton是一个单例的封装类,第一次调用它的get方法时它会通过create方法来初始化AMS这个Binder对象.

      checkStartActivityResult的作用就是检查启动Activity的结果,当无法正确地启动一个Activity时,这个方法会抛出错误信息.

      Activity的启动过程在ActivityStackSupervisor和ActivityStack之间的传递顺序

      

 

      performLaunchActivity这个方法主要完成了如下几件事

        1.从ActivityClientRecord中获取待启动的Activity的组件信息.

        2.通过Instrumentation的newActivity方法使用类加载器创建Activity对象.

        3.通过LoadedApk的makeApplication方法来尝试创建Application对象.

        4.创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化.

        5.调用Activity的onCreate方法

 

    9.3 Service的工作过程

        Service分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用户其它组件和Service的交互.

        通过Context的startService方法即可启动一个Service.

      9.3.1 Service的启动过程

        从ContextWrapper的startActivity开始

        AMS会通过mServices这个对象来完成Service后续的启动过程,mServices对象的类型是ActiveServices,用来辅助AMS进行Service管理的类,包括Service的启动,绑定和停止.

        handleCreateService:

          首先通过类加载器创建Service的实例.

          然后创建Application对象并调用其onCreate.

          接着创建ConTextImpl对象并通过Service的attach方法建立二者之间的关系

          最后调用Service的onCreate方法并将Service对象存储到ActivityThread中的一个列表中.

      9.3.2 Service的绑定过程

        主要通过AMS来完成Service的具体绑定过程,bindService方法

        AMS会调用ActiveServices的bindServiceLocked方法...最终通过ApplicationThread来完成Service实例的创建并执行其onCreate方法.

    9.4 BroadcastReceiver的工作工程

      一个是广播的注册过程,另一个是广播的发送和接收过程.

      在AndroidManifest文件中静态注册

      <receiver android:name=".MyReceiver">

        <intent-filter>

          <action android:name="com.example.receiver.LAUNCH">

        </intent-filter>

      </receiver>

      9.4.1 广播的注册过程

        静态注册和动态注册

        是由PMS(PackageManagerService)来完成整个注册过程.

        动态注册的过程是从ContextWrapper的registerReceiver方法开始的.

        最终会把远程的InnerReceiver对象以及IntentFilter对象存储起来.

      9.4.2 广播的发送和接收过程

        当通过send方法来发送广播是,AMS会查找匹配的广播接受者并将广播发送给他们处理.

        普通广播,有序广播和粘性广播.

        广播发送仍然开始于ContextWrapper的sendBroadcast方法.将事情交给ContextImpl去处理.

        在broadcastIntentLocked的内部,会根据intent-filter查找出匹配的广播接收者并经过一些列的条件过滤,最终会将满足条件的广播接收者添加到BroadcastQueue,接着BroadcastQueue就会将广播发送给相应的广播接收者.

    9.5 ContentProvider的工作过程

        一种内容共享性组件,它通过Binder向其他组件乃至其它应用提供数据,当ContentProvider所在的进程启动时,ContentProvider会同时启动并被发布到AMS中.

        ContentProvider启动过程:

          

         

        

以上是关于第九章:四大组件的工作过程的主要内容,如果未能解决你的问题,请参考以下文章

从源码的角度理解四大组件的工作过程——Android开发艺术探索笔记

Android N 四大组件的工作原理

Android深入四大组件Service的启动过程

Android深入四大组件广播的注册发送和接收过程

Android深入四大组件Service的绑定过程

Android 四大组件 - 进程的 fork 创建过程