四大组件运行状态
四大组件除了BroadcastReceiver,其他三个组件都必要在AndroidManifest中注册。对于BR来说可以在配置文件中注册,也可以在代码中注册。调用方式上,Activity、Service、BR需要借助Intent,而ContentProvider则不需借助Intent。
Activity是展示型组件,向用户提供一个界面。可以接受用户的输入信息从而进行交互。
Service是一种计算型组件,用户在后台执行一系列的计算任务。用户无法感知到它的存在。它默认是在主线程中运行,如果是耗时的任务仍需要在单独的线程中去执行。
BroadcastReceiver是一种消息型组件。用于在不同的组件乃至不同的应用之间传递消息。有两种注册方式,静态注册和动态注册,静态注册是在配置文件中注册,动态注册是在代码中注册。静态注册会在安装时就会被系统解析,因此不需要启动程序就可以收到相应的广播,而动态注册必须启动应用后才能收到广播。BR组件可以实现低耦合的观察者模式。BR它也不适合执行耗时的操作。
ContentProvider是一种数据共享型组件,用于想其他组件或者其他应用共享数据。
Activity工作过程(关键节点)
Activity的startActivity有好几种重载方法,但是最终都是调用startActivityForReuslt方法。在经过Instrumentation中的execStartActivity方法,发现Activity真正的实现是由ActivityManagerNative.getDefault()的startActivity完成。ActivityManagerService(AMS)继承自ActivityManagerNative(AMN),因此Activity的启动过程又转移到了AMS的startActivity中。在这个方法中,Activity的启动过程是这样:先转移到ActivityStackSupervisor中在相继执行下面的方法,见流程图
ActivityStackSupervisor.png在ActivityStackSupervisor的realStartActivityLocked方法中有一段代码app.thread,这个类型是IApplicationThread,IApplicationThread继承自IInterface接口,它是一个Binder类型的接口。IApplicationThread的实现者是ActivityThread中的内部类ApplicationThread。在ApplicationThread中通过scheduleLaunchActivity来启动Activity。该方法发送一个H(Handler) ,在这个H中有对"LAUNCH_ACTIVITY"消息处理得知,Activity启动是ActivityThread的handleLanuchActivity来实现,再由performLaunchActivity完成了Activity对象的创建和启动过程。performLaunchActivity这个方法主要完成了如下几件事:
1.从ActivityClientRecord中获取待启动的Activity的组件信息
2.通过Instrumentation的newActivity方法使用类加载器 创建Activity对象
3.通过LoadedApk的makeApplication方法来尝试创建Application
4.创建ContextImpl对象通过Activity的attach方法来完成一些重要数据的初始化。
5.调用Activity的oCreate方法
网友评论