app的启动流程都包括哪些步骤?
一、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 里面做延迟加载,也可以将一些初始化的操作延迟到组件真正被调用的时候再做加载。例如,不创建全局静态对象,而是转为单例模式,其中应用仅在名列前茅次访问对象时初始化它们。

相关推荐HOT
更多>>
在 iPad 上运行 Windows 是什么体验?
一、在 iPad 上运行 Windows 是什么体验目前市面上有一些能够在 iPad 上运行 Windows 的应用程序,例如 Parallels Access、Splash较好、VMware ...详情>>
2023-10-14 19:14:27
vector, list, map等容器使用场合是什么?
一、vector, list, map等容器使用场合vector适用于对象简单,变化较小,并且频繁随机访问的场景。list适用经常进行插入和删除并且不经常随机访...详情>>
2023-10-14 14:59:11
分库分表的数据库和分布式数据库有什么区别?
一、分库分表的数据库和分布式数据库有什么区别分库分表的数据库:没有这种数据库,所谓分库分表,这是开发应用的程序员通过自己的代码、或者底...详情>>
2023-10-14 13:59:18
APP定制开发的难点有哪些?
一、APP定制开发的难点1、多平台适配不同的移动平台(如iOS和Android)具有不同的操作系统、开发语言和开发工具。在进行APP定制开发时,需要适...详情>>
2023-10-14 12:57:35