千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > app的启动流程都包括哪些步骤?

app的启动流程都包括哪些步骤?

来源:千锋教育
发布人:xqq
时间: 2023-10-13 10:03:27 1697162607

一、app的启动流程包括的步骤

1、创建进程

App发起进程:当从桌面启动应用,则发起进程便是Launcher所在进程;当从某App内启动远程进程,则发送进程便是该App所在进程。发起进程先通过binder发送消息给system_server进程。system_server进程:调用Process.start()方法,通过socket向zygote进程发送创建新进程的请求。zygote进程:在执行ZygoteInit.main()后便进入runSelectLoop()循环体内,当有客户端连接时便会执行ZygoteConnection.runOnce()方法,再经过层层调用后fork出新的应用进程。新进程:执行handleChildProc方法,最后调用ActivityThread.main()方法。

2、绑定Application

上面创建进程后,执行ActivityThread.main()方法,随后调用attach()方法。将进程和指定的Application绑定起来。这个是通过ActivityThread对象中调用bindApplication()方法完成的,该方法发送一个BIND_APPLICATION的消息到消息队列中,最终通过handleBindApplication()方法处理该消息,然后调用makeApplication()方法来加载App的classes到内存中。

二、App启动方式

1、冷启动

当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

2、热启动

当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。

三、影响APP启动性能的因素

1、密集型应用初始化

如果您在代码中替换了Application对象,且在Application对象进行初始化的时候执行了密集的工作或者复杂的逻辑,那么您的启动性能就会受到影响。如果您的应用子类执行尚不需要完成的初始化,则应用可能会在启动过程中浪费更多的时间,并且有些初始化可能是完全不必要的。

如果Application 里面的初始化操作不结束的话,其他任意的程序操作都是无法进行的。因此,在 Application 初始化的地方做太多密集的工作或者复杂的逻辑是导致启动性能问题的元凶之一。

在做 Application的初始化工作时,很多组件是需要我们区别对待的,有些组件适合做延迟加载,有些则适合放到其他的地方做初始化操作,在此我们需要特别留意包含 Disk IO的操作,因为网络访问等严重耗时的任务,是会严重影响程序启动的。

2、密集型 Activity 初始化

我们在创建 Activity 时通常需要开展大量的高开销工作,用来提升 Activity 的创建速度,因为提升 Activity 的创建速度是优化 APP 启动速度的首要目标。从桌面点击 APP 图标启动应用开始,程序会显示一个启动窗口等待 Activity 的创建加载完毕再进行显示。在 Activity 的创建加载过程中,应用会执行很多的操作,例如设置页面的主题,初始化页面的布局,加载图片,获取网络数据,读写 Preference 等等。

上述操作的任何一个环节出现性能问题都可能导致画面不能及时显示,从而影响应用程序的启动速度。

延伸阅读1:密集型应用初始化导致app启动性能差的解决方法

优化这些问题的解决方案是给应用做延迟加载处理,可以在 Application 里面做延迟加载,也可以将一些初始化的操作延迟到组件真正被调用的时候再做加载。例如,不创建全局静态对象,而是转为单例模式,其中应用仅在名列前茅次访问对象时初始化它们。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT