5分钟帮你打造一个快速启动的app(app启动分析与优化)

一、启动方式:

(1)冷启动:

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

(2)热启动

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

二、启动时间的测量:

(1)Activity启动时间的定义:

对于Activity来说,启动时,首先执行onCreat(),onStart(),onResume()这些生命周期函数,但即使这些生命周期方法回调结束了,应用也不算完全启动,还需要等View树完全全部构建完毕,一般认为setContentView中的View全部显示结束了,才是应用完全启动了。

(2)DisPlay Time

从api19后,Android系统的log信息中增加了Display的log信息,通过过滤ActivityManager和Display这两个关键字,可以找到系统中这个log,抓到的log如下图所示:

这里写图片描述

这个时间实际是Activity启动到Layout全部显示的过程。

三、优化方式

1、优化Application的启动过程中耗时操作

2、第一个Activity的界面渲染问题

Application:

Application是程序的主入口,特别是很多的第三方SDK都需要在Application的onCreat()中进行初始化操作,一般来说我们可以将这些初始化放在一个单独的线程中处理。
优化方法:

1、异步初始化

让onCreat()里面尽可能的少做事情,尽可能的利用多线程。例如一些第三方SDK的初始化,能放线程就尽量放线程,最简单的直接new一个线程。

这里写图片描述

2、后台初始化

就是通过服务service进行初始化,Application代码如下:

这里写图片描述

新建一个InitService继承IntentService:

这里写图片描述

这里为什么用IntentService呢?
首先解释一下IntentService,官方的解释:

IntentService is a base class forServices that handle asynchronous requests (expressed asIntents) on demand. Clients send requests throughstartService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work

IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
还有一个是:

All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.

大致意思是:所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。
用IntentService有什么好处呢?第一,我们省去了在Service中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止Service。

这里别忘了注册服务:

这里写图片描述

3、界面预加载(优化应用启动体验)

当系统加载一个Activity的时候,onCreat()是一个耗时的过程,那么在这个过程中,系统为了给用户一个比较好的体验,实际上会先绘制一些初始界面.系统会首先读取Activity的Theme,然后根据Theme中的配置来绘制。当Activity加载完后才替换成真正的界面。这就是为什么启动的app的时候会出现黑屏或者白屏。

谷歌官方提供的解决方案,就是通过android:windowBackground属性来进行加载前的配置。这里可以设置颜色和图片。我们可以使用一个layer-list来作为android:windowBackground属性要显示的图:

这里写图片描述

values的styles.xml里面代码:

这里写图片描述

给MainActivity设置主题,AndroidManifest.xml代码:

这里写图片描述

然后在MainActivity中加载布局前把AppTheme重新设置给MainActivity代码:

这里写图片描述

启动时先显示我们设置的主题,然后待界面绘制完成再显示主界面,避免出现黑白屏:

这里写图片描述

第一个Activity的渲染问题:

Android系统每隔16ms会发出VSYNC信号重绘界面(Activity)

为什么是16ms?因为android系统设定的刷新率是60FPS(Frame Per Second),就是每秒60帧的刷新率,约16ms刷新一次,这就意味着我们要在16ms内完成下一次界面刷新的相关运算。如果我们跟新一张图片需要28ms,那么在第一个16ms内刷新还没结束,我们看不到图片,那就要等下一个16ms,32ms才能等到刷新完成,这就是丢帧(dropped frame)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值