Android系统启动App及 app怎么去启动一个Activity的流程总结

    xiaoxiao2021-03-25  58

     研究了几天,终于把系统启动APP及APP怎么去启动一个Activity的流程梳理出来,大家可以参照我的总结去看底层源码。

    1.系统启动APP:

                2.App怎么启动Activity 的

    当前进程(Client进程)通知AMS进程自己需要启动一个Activity。具体是Instrumentation.execStartActivity方法中获取到AMS的ActivityManagerProxy代理(ActivityManagerNative.getDefault()),通过代理中mRemote.transact()这种Binder机制调用AMS的startActivity接口真正的去启动Acticity。 AMS进程收到启动请求后,通过ActivityStack把需要启动的Activity信息以ActivityRecord对象的形式保存下来,然后通过Binder机制向当前Client进程发起一个Pause状态请求。具体步骤为:获取ApplicationThread(Binder)对象的远程接口,通过Binder机制调用这个远程接口的schedulePauseActivity,再以发消息的形式通知到H,在H中执行ActivityThread的handlePauseActivity,然后通知AMS自己已经执行完Pause。 AMS判断是否需要开启新的进程来启动Activity,如果需要,AMS就会调用Process.start方法,fork一个进程通过反射调用ActivityThread类的main方法。main方法中会创建一个ActivityThread实例,然后调用它的attach函数,接着就进入消息循环了,直到最后进程退出。 ActivityThread的attach方法向AMS传入了一个ApplicationThread对象(以IApplicationThread.asBinder的形式写入Parcel)。会调用到AMS的attachApplicationLocked方法,AMS会将这个对象和之前创建的进程关联,最后AMS再通过Binder通知客户端ApplicationThread去启动程序主Activity。 客户端ApplicationThread收到AMS发送的启动Activity请求后,发送Handler消息通知ActivityThread最终执行performLaunchActivity方法,通过Instrumentation以反射的形式创建Activity对象,再用Classloader加载到虚拟机。然后在创建Application对象和ContextImpl对象,再通过Activity.attach方法把Activity Application、ContextImpl三者关联起来。最后由Instrumentation.callActivityOnCreate执行onCreat生命周期方法。

    转载请注明原文地址: https://ju.6miu.com/read-35555.html

    最新回复(0)