Android--进程的启动流程

1.进程的启动流程

1 ) startActivity开始,跨进程调用AMS.拿到AMS的代理对象,调用startActivity
通过mRemote.transact()发送请求,把请求的数据封装到data中写入binder驱动,转发到AMS,AMS收到onTransact的回调.然后在AMS中startActivity()–> 在ActivityStackSupervisor里调用startSpecificActivityLocked()。

2 ) 在AMS里先检查进程是否启动了。检查进程启动的标志是 processRecord是否存在,并且向AMS注册过自己的ApplicationThread。
都满足条件说明进程已经启动过了。直接调用realStartActivityLocked()真正的启动Activity。
如果条件不满足,调用mservice.startProcessLocked()等到进程启动之后再回过来启动activity还是调用realStartActivityLocked()方法

3 )在StartProcessLocked里,调用Process.start(entryPoint也就是applicationthread,此处是告诉zygot启动完成后的回调),启动完成之后会返回进程的pid。在这里会发送一个延时消息10s,判断进程是否启动成功。超时会清理应用启动相关信息。
Process.start()调用了startViaZygote(),做了两件事,一个是打开通往zygote的socket,通过socket发送启动进程的参数然后返回结果。Zygote进程:读取参数列表,创建子进程 Zygote.forkAndSpecialize()。进程创建完成后调用ActivityThread的main函数。

4)ActivityThread: prepare一个mainLoopernew一个 ActivityThread调用 attach方法。attach的实现是一个跨进程调用,把applicationThread传给了AMS。

5)【IActivityManager.attachApplication()】.此处是向AMS报道,呼应上面的10s延迟。否则就timeout了。
attachApplication的具体实现在AMS的attachApplicationLocked(),先找到对应的processRecord,然后拿到传过来的thread.bindApplication()。此过程是AMS向新创建的应用通信,主要是应用的一些初始化。

6 )attachApplicationLocked():实现是在activityStackSupervisor里。在此方法里,拿到stack调用topRunningActivity。再次调用realStartActivityLocked方法,启动activity。
realStartActivityLocked():ActivityStackSupervisor.java:app.thread.scheduleLuanchActivity(),这里通过binder调用,AMS通过applicationThread调用。
applicationThread处理是把消息封装成一个msg通过handler发送到主线程处理。应用端ActivityThread接到调用后走到scheduleLaunchActivity()。

7 ) handleLaunchActivity():先调用一个performLaunchActivity(),在这个方法里,通过mInstrumentation.newActivity()创建了一个activity对象。注意activity是在这里创建的。然后创建上下文【creatBaseContextForActivity(),创建一个contextImpl】,拿到之前创建的application,然后activity.attach(appContext).在这里赋予activity上下文。
然后就可以调用activity的生命周期了【mInstumentation.callActivityOnCreate】,就是回调了Activity的onCreate()方法。然后performstart调用onStart()方法。
handleResumeActivity():调用activity的onResume方法,activity显示出来。
Activity创建后的流程:创建Activity对象 ->创建上下文 -> 准备好Application -> Attach上下文 -> 生命周期回调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值