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

2020-05-08  本文已影响0人  SunnyGL

Activity 的工作过程

Activity.startActivity
-> Activity.startActivityForResult
-> Instrumentation.execStartActivity(参数 ApplicationThread,为 ActivityThread 的一个内部类)
-> ActivityManagerNative.startActivity(ActivityManagerNative 为 AMS 远程代理类)
-> AMS.startActivity(IPC)
-> AMS.startActivityAsUser
-> ActivityStackSupervisor.startActivityMayWait
-> ActivityStackSupervisor.startActivityLocked
-> ActivityStackSupervisor.startActivityUncheckedLocked
-> ActivityStack.resumeTopActivitiesLocked
-> ActivityStack.resumeTopActivityInnerLocked
-> ActivityStackSupervisor.startSpecificActivityLocked
-> ActivityStackSupervisor.realStartActivityLocked
-> IApplicationThread.scheduleLaunchActivity(IApplicationThread 为 ApplicationThread 远程代理类)
-> ApplicationThread.scheduleLaunchActivity(IPC)
-> ApplicationThread.sendMessage(发送一个消息到 H,H 为 Handler)
-> ActivityThread.handleLaunchActivity
-> ActivityThread.performLaunchActivity(1.从 ActivityClientRecord 中获取待启动的 Activity 的组件信息 2.通过 Instrumentation 的 newActivity 方法使用类加载器创建 Activity 对象 3.通过 LoadedApk 的 makeApplication 方法来尝试创建 Application 对象 4. 创建 ContextImpl 对象并通过 Activity 的 attach 方法来完成一些重要数据的初始化 5. 调用 Activity 的 onCreate 方法
-> ActivityThread.handleResumeActivity(调用 Activity 的 onResume 方法)


Activity 的工作过程.png

Service 的工作过程

Service 的启动过程

ContextWrapper.startService
-> ContextImpl.startService
-> ContextImpl.startServiceCommon
-> ActivityManagerNative.startService(ActivityManagerNative 为 AMS 远程代理类)
-> AMS.startService(IPC)
-> ActiveServices.startServiceLocked(ActiveServices 是一个辅助 AMS 进行 Service 管理的 类)
-> ActiveServices.startServiceInnerLocked
-> ActiveServices.bringUpServiceLocked
-> ActiveServices.realStartServiceLocked

-> IApplicationThread.scheduleCreateService(IApplicationThread 为 ApplicationThread 远程代理类)
-> ApplicationThread.scheduleCreateService(IPC)
-> ActivityThread.sendMessage(发送一个消息到 H,H 为 Handler)
-> ActivityThread.handleCreateService(1.通过类加载器创建 Service 的实例 2.创建 Application对象 3.创建
ContentImpl 对象并通过 Service 的 attach 方法建立二者之间的关系 4.调用 Service 的 onCreate 方法并将 Service 对象存储到 ActivityThread 中的 mServices 列表中)

-> ActiveServices.sendServiceArgsLocked
-> IApplicationThread.scheduleServiceArgs(IApplicationThread 为 ApplicationThread 远程代理类)
-> ApplicationThread.scheduleServiceArgs(IPC)
-> ActivityThread.sendMessage(发送一个消息到 H,H 为 Handler)
-> ActivityThread.handleServiceArgs(调用 Service 的 onStartCommand 方法)


Service 的启动过程.png
Service 的绑定过程

ContextWrapper.bindService
-> ContextImpl.bindServiceCommon(将客户端的 ServiceConnection 对象转化为ServiceDispatcher.InnerConnection 对象,在 ServiceDispatcher 内部会建立 ServiceConnection 和 InnerConnection 的对应关系)
-> ActivityManagerNative.bindService
-> AMS.bindService.bindService(IPC)
-> ActiveServices.bindServiceLocked

-> ActiveServices.bringUpServiceLocked
-> ActiveServices.realStartServiceLocked(此后过程和 Service 的启动过程一致)

-> ActiveServices.requestServiceBindingLocked
-> IApplicationThread.scheduleBindService
-> ApplicationThread.scheduleBindService(IPC)

    -> ActivityThread.handleBindService(1.根据 Service 的 token 取出 Service 对象,然后调用 Service 的 onBind 方法 )

    -> ActivityManagerNative.publishService
    -> AMS.publishService(IPC)
    -> ActiveServices.publishServiceLocked
    -> IServiceConnection.connected
    -> LoadedApk.ServiceDispatcher.InnerConnection.connected(IPC)
    -> LoadedApk.ServiceDispatcher.connected(将 RunConnection 通过 Handler post 到主线程中执行)
    -> LoadedApk.ServiceDispatcher.RunConnection.run
    -> ServiceDispatcher.doConnected
    -> ServiceConnection.onServiceConnected


Service 的绑定过程.png
上一篇下一篇

猜你喜欢

热点阅读