admin 发表于 2017-2-17 16:42:49

你所不知道的Andorid启动页(欢迎界面)

序言:今天老大让我去找UI要一张启动页的图,然后给项目加个启动页,放进去之后也没管那么多,后来运行项目的时候发现有点瑕疵,来看下图:http://upload-images.jianshu.io/upload_images/490111-fd5d7f5f2178b43a.gif?imageMogr2/auto-orient/strip

可能有人要问了,这不是挺好的一个欢迎界面吗?有啥问题,我相信看的仔细的看官会发现启动之后有一段时间是空白的,即使是很短,让人看着也不舒服,这时候可能又有人说了,那可能是你在application里面干了耗时的事才导致的,话说我一开始也是这样觉得的,然后我令写一个demo作测试,发现然而并不关你的application什么事儿,因为我都没有application,启动的时候依然有这样的问题,然后我就去对比我手机上腾讯公司和其他公司的产品,我发现他们的app大多是在你手指按下桌面图标的时候,先"静止"一段时间,然后再启动,而且中间一点白色的间隙也没有,这是什么鬼,带着疑惑,我去百度了一番,发现问题还真有:http://upload-images.jianshu.io/upload_images/490111-63a1aeb0b9f923d5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

后来我才之后,原来有冷热启动这一说:1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。特点:冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。特点:热启动因为会从已有的进程中来启动,所以热启动就不会走application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化application,因为一个应用从新进程的创建到进程的销毁,application只会初始化一次。既然上述问题不是出在application,那么肯定就是在Activity了,我是这么想的,然后我就想着是不是SetContentView的时候花了很多时间呢?然后我又测试了一遍:@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    long startTime = System.currentTimeMillis();
    setContentView(R.layout.activity_start);
    Log.d(TAG, "time===" + (System.currentTimeMillis() - startTime));
}
然后打印出来的时间是:http://upload-images.jianshu.io/upload_images/490111-3f34903d2e11ca5e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

哈,果真是setContentView导致的,那就很好解决了,我们不要setContentView就好了,可能还有人要问了,你不要setContentView你咋加载布局呢?别急,别忘了还有theme这个好东西啊!我们可以定义一个theme,然后给theme设置背景就好了:<style name="StartTheme" parent="AppTheme">
    <item name="android:windowBackground">@mipmap/icon_splash</item>
</style>

好了,大功告成,我们来看看效果:http://upload-images.jianshu.io/upload_images/490111-08a18a082a358618.gif?imageMogr2/auto-orient/strip

注:setContentView的内部原理有兴趣的同学可以自己去百度看看,看看在哪里耗时了
问题:
提个建议:当初我也尝试过是这么做的,但有个问题,图片的内存会释放不掉,所以放在activity的super调用前,用流资源方式加载图片,设置到window的背景中去就好了
原文地址:
http://www.jianshu.com/p/33a798ac3298

Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法
http://blog.csdn.net/zivensonice/article/details/51691136
0
页: [1]
查看完整版本: 你所不知道的Andorid启动页(欢迎界面)