美文网首页Android开发实战总结APP安卓
你所不知道的Android启动页(欢迎界面)

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

作者: 24K纯帅豆 | 来源:发表于2016-11-07 10:45 被阅读18773次

序言:今天老大让我去找UI要一张启动页的图,然后给项目加个启动页,放进去之后也没管那么多,后来运行项目的时候发现有点瑕疵,来看下图:

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

后来我才之后,原来有冷热启动这一说:

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));
}

然后打印出来的时间是:

哈,果真是setContentView导致的,那就很好解决了,我们不要setContentView就好了,可能还有人要问了,你不要setContentView你咋加载布局呢?别急,别忘了还有theme这个好东西啊!我们可以定义一个theme,然后给theme设置背景就好了:

<style name="StartTheme" parent="AppTheme">
    <item name="android:windowBackground">@mipmap/icon_splash</item>
</style>

好了,大功告成,我们来看看效果:

注:setContentView的内部原理有兴趣的同学可以自己去百度看看,看看在哪里耗时了

公众号:Android技术经验分享

相关文章

网友评论

  • PeaceJay:涨姿势了!不过启动页用的png图片 要换成jpg格式才好看:smile:
    24K纯帅豆:@fdcc01ad77c4 看你自己需求了,不过有的可能是透明的话那就不能用png了,jpg小点
  • ac90cd96f51b:测试了下. 如果 MainActivity 没有设置背景的话, 那在 Main 这里也会看到这个图.
    24K纯帅豆:@小沈同学 是的,这个theme只是SplashActivity,不是全局的
    ac90cd96f51b: 明白了, 原因是我把theme设成application里的了, 应该设置到SplashActivity中.
  • 899e2d74bdeb:请问, 怎么在activity 里设置 getWindow().setBackgroundDrawableResource(R.drawable.splash);这个没有效果的?
  • 大天使之剣:感谢分享 让没遇到过该问题的猿们涨姿势了🤗🤗
    大天使之剣: @24K纯帅豆 在下秋名山第一车神
    24K纯帅豆:@国服第一上单 昵称略屌,也是国服学院?
  • 南城的人:您好!我想问您一个问题,就是安卓4.4版本后的手机支持计步功能(4.4版本后的系统中写含有计步传感器,此时如果手机硬件功能中含有传感器,那么就可以实现计步功能),另外一种情况是手机中不含有计步传感器(硬件),此时应怎样实现计步功能?
  • BillBian:看了好多评论,不管怎么想法很好:+1:
    24K纯帅豆:@被风追的猪 可以的,有收获就好
    BillBian:@24K纯帅豆 每次来看一些文章的时候,都能有些收获
  • 笔绘丹心:谢谢你的文章,我看了下我的app也有这个问题,看了你的文章,刚刚修复了。:+1:
  • 76ffef5441ab:24k纯帅 这个id 好像 是某个网红的id 好像在哪见过 ,
  • 嘘不要声张:哈哈 我也是这么干的!但是发现了一些问题,闪屏页图片会作为应用的根背景,有时候页面切换,或者键盘弹出再收回时会暴露出来,囧
    24K纯帅豆:那不会的吧,你是不是把app的style设置成闪屏页的吧
  • 蒲导:这个问题我也遇到过, 我也是这么解决的,使用theme
    application子类确实做了很多初始化的操作
    24K纯帅豆:这样做其实也不好的,这个只是当初图一时方便,等有空我会把好一点的解决方法补上,如果你也有更好的方法,咱们可以互相交流
  • 27cf1b7aafea:个人推荐:http://blog.csdn.net/zivensonice/article/details/51691136
    偷师学艺,别无他意。
    谢过
    24K纯帅豆:666,可以的,能想到去反编译
  • Merbng:机型适配导致的图片缩放考虑到了吗
    24K纯帅豆:@Merbng 这一篇只是为了说明上述的问题呢!其他的什么还没有考虑的呢!你可以参考楼上的楼上(@奈文摩尔定律)说的那个方法呢
  • MeloDev:标题拼错了。。。Android
    24K纯帅豆:@sendtion :joy: :joy: 不要在意这些细节
    sendtion:@24K纯帅豆 你并没有改:smirk:
    24K纯帅豆:@MeloDev :stuck_out_tongue_winking_eye: 谢谢指正,已更正
  • 奈文摩尔定律:提个建议:当初我也尝试过是这么做的,但有个问题,图片的内存会释放不掉,所以放在activity的super调用前,用流资源方式加载图片,设置到window的背景中去就好了
    笔绘丹心:我刚刚试了下,有短暂空白,类似闪屏
    27c7534af0e9:求贴代码
    24K纯帅豆:@奈文摩尔定律 是的呢!这里我还没有考虑内存的问题,这一篇我主要还是为了说明上述的问题所在,你说的方法我会去试试的,谢谢哈

本文标题:你所不知道的Android启动页(欢迎界面)

本文链接:https://www.haomeiwen.com/subject/fhobuttx.html