Activity启动

Activity启动分为两种:一种是通过startActivity启动,一种是通过点击手机桌面图标启动。那这两种启动方式有什么区别呢,第一种是普通Activity的启动,第二种启动方式是冷启动。冷启动和普通启动方式又有什么区别呢,冷启动就是app的首次启动,需要创建app进程,普通启动是不需要的。

冷启动的启动流程

  1. 我们点击桌面app图标,桌面系统会调用startActivitySafely方法,然后会调用startActivity,mInstrumentation.execStartActivity,然后会调用ActivityTaskManager.getService()的startActivity方法,这里会经过一次进程通信,ActivityTaskManager.getService()是服务端在客户端的代理类,调用它的startActivity方法会走到服务端ActivityTaskManagerService处理并返回结果,然后通过checkStartActivityResult(result, intent)方法检查activity是否合法。

  2. 接下来看服务端的startActivity方法最终ActivityStack resumeTopActivityUncheckedLocked方法:如果是冷启动就会在这个方法里调用了next.showStartingWindow方法来展示一个window,这就是 冷启动时 出现白屏 的原因了。然后执行mStackSupervisor.startSpecificActivityLocked(next, true, true);方法,在这会判断是否有IAPPlicationThread,冷启动是没有这个的,就会通过Zygote通过fork创建了一个进程,在新建的进程创建binder线程池,然后通过反射获取到了ActivityThread类并执行了main方法,在main方法里初始化looper,创建ActivityThread实例,同时会创建ApplicationThread实例,ApplicationThread实例是ActivityThread实例的属性,然后调用了attach方法:在这个方法中,把ApplicationThread实例关联到AMS中,mgr.attachApplication(mAppThread, startSeq);

  3. 就是IPC的走到AMS的attachApplication方法了:在ams里通过ipc创建绑定了application,并通过makeActive方法赋值IApplicationThread,通过ams启动activity。会执行ams的realStartActivityLocked方法。在这个方法里会设置启动状态和activity接下来的生命周期状态,并调用mService.getLifecycleManager().scheduleTransaction(clientTransaction);通过进程通信把Activity启动的操作又跨进程的还给了客户端