android系统初始化分为三个过程:
- Init 进程
- Zygote进程
- SystemServer进程
Init进程完成的任务:
- 启动属性服务器,类似window上的注册表
- 挂在Linux内核文件
- fork得到Zygote进程
Zygote进程:
Zygote进程由AppRuntime调用start方法启动
- 启动java虚拟机,注册jni方法
- 创建Socket 与客户端进行通讯。同事进入无限循环处理AMS发过来的请求
- 启动SystemServer进程
SystemServer进程:
- 启动Binder池,这样就可以进行进程间通讯
- 创建SystemServerManager。用于管理系统服务
- 启动系统 的各种服务,例如AMS,PMS
Launcher过程:
SystemServer.startOtherService方法 –> ActivityManagerService的systemReady方法 –> startHomeActivityLocked方法 –> ActivityStackSupervisor的startHomeActivity方法 –> 执行Activity的启动逻辑,执行scheduleResumeTopActivities()方法。
Launcher 启动应用进程
通过intent的隐式启动首先会执行到:mInstrumentation.execStartActivity-------> ActivityManagerNative.getDefault().startActivity()---------------> ams.startProcessLocked---------> zygoteProcess.start------------>zygoteinit.runselectLo0p-------->zygote.runonce------->zygoteConnect 与socket建立连接------------->zygoteConnect fork应用进程------>handleChild or handleParent 进而通过RuntimeInit throw exception 进入ActivityThread的main方法
总结:
android应用进程会在需要启动其组件的时候启动,当没有任何组件运行或者是系统内存较低的时候应用进程会被杀死。
在启动应用四大组件的时候若发现当前应用的进程没有启动,则会首先启动应用程序的进程。
我们可以为应用程序配置多个进程,每个进程都有自己的JVM和运行环境,各个进程之间的通讯需要通过Binder机制。
Launcher启动的过程也是先启动Launcher进程再启动其Activity组件
Activity跳转流程
Activity.startActivity------> mInstrumentation.execStartActivity------->ActivityManagerNative.getDefault().startActivity()------->AMS.startActivityAsUser----------->ActivityStackSuperVisor.realStartActivityLocked-------ApplicationThread.scheduleLaunchActivity-------->ActivityThread.performLaunchActivity
Service start过程
activity.startService----->ContextImple.startService----->AMS.startService------->ActivityServices.realStartServiceLocked------->ApplicationThread.scheduleCreateService----------->ActivityThread.handleCreateService
Broadcast过程
从实现原理看上,Android中的广播机制使用了观察者模式,基于消息的发布/订阅模型。
广播发送者和广播接收者分别属于观察者模式中的消息发布和订阅两端,AMS属于中间的处理中心。
整体来看,流程可粗略概括如下:
1.广播接收者BroadcastReceiver,通过Binder通信向AMS进行注册;
2.广播发送者通过Binder通信向AMS发送广播;
3.AMS收到广播后,查找与之匹配的BroadcastReceiver,然后将广播发送到BroadcastReceiver对应进程的消息队列中;
4.BroadcastReceiver对应进程的处理该消息时,将回调BroadcastReceiver中的onReceive()方法;
5.广播处理完毕后,BroadcastReceiver对应进程按需将执行结果通知给AMS,以便触发下一次广播发送。
对于不同的广播类型,以及不同的BroadcastReceiver注册方式,具体实现上会有不同,但整体的通信流程大致相似