Android启动页黑屏及最优解决方案

前言

相信作过Android的朋友都知道,当一个APP启动时,界面会首先展现一个白屏或者黑屏,而后再进入欢迎页,稍做停留最后进入APP主页。那么这个黑屏或者白屏究竟是怎么一回事呢?它的最好的解决方案应该是怎样的呢?今天咱们认真的讨论一下这个小问题。 点击获取本次项目的demojava

历史缘由

当系统启动一个APP时,zygote进程会首先建立一个新的进程去运行这个APP,可是进程的建立是须要时间的,在建立完成以前,界面是呈现假死状态的,这就很尴尬了,由于用户会觉得没有点到APP而再次点击,这极大的下降用户体验,Android须要及时作出反馈去避免这段迷之尴尬。因而系统根据你的manifest文件设置的主题颜色的不一样来展现一个白屏或者黑屏。而这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。 好了,如今咱们明白了,Preview Window实际上是为了提升用户体验而有意设定的。所以,其实若是不是强迫症,它可能并非一个问题。 可是我猜大部分小伙伴应该是和我同样的强迫症患者:这么丑的黑屏怎么能出如今个人APP上呢???!!! 因此,下面咱们就来聊聊这个问题的解决方案。react

解决方案

既然决定解决这个问题,那么从哪里入手呢,Android在选择展现黑屏或者白屏的时候,是根据你设定的主题而不一样的,也就是说,虽然你的代码没有被执行,你的配置文件却被提早读取了,用来做为展现Preview Window界面的依据。 因此,咱们的解决方案的切入口就是整个APP的manifest文件,更确切的说应该是主题配置文件。android

方案一 :开历史倒车

这个方案就是禁止加载Preview Window,具体作法以下:git

<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar">
<item name="android:windowDisablePreview">true</item>
</style>

复制代码将APPTheme设定为启动的Activity的主题,便可禁止Preview Window,固然,也有人经过把preview window设置为全透明,也达成了相似的效果。 结果就是,当你点击APP时,界面会无响应一段时间,而后进入APP。 我我的强烈不推荐这么作,由于Android千方百计提高的用户体验一会儿被你打回解放前。github

方案二:自定义Preview Window 具体方法以下:

<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_icon</item>
</style>

复制代码一样将主题设置到启动的Activity的主题中,windowBackground就是即将展现的preview window。其中splash_icon能够是一整张图片,网上不少小伙伴也都是这么作的。其实它也能够是一个能解析出图片资源的XML文件,好像只有layer-list这种能作获得,由于它可以将多个drawable叠加起来展现。react-native

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">
    <item android:drawable="@color/white"/>
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/qq"/>
    </item>
</layer-list>

复制代码这样设置以后,当你点击APP,会立马进入你配置的界面,而后启动欢迎页,效果以下框架

那么,将preview window直接设置为图片和设置为xml文件有什么区别或者优劣呢?我先卖个关子。先谈谈这种方案的优劣,首先这种方案已经解决了原生preview window的单调难看的问题,在原来的基础上进一步提高了用户体验。但是咱们的APP都是有欢(guang)迎(gao)页的,从preview window跳转到欢(guang)迎(gao)页是不可避免的,这样的话,两个界面的切换就会显得很突兀的, 因此强迫症的咱们,尝试让这两个界面的切换变成一个界面的变化,从而进一步提高显示效果,怎么样才能让两个界面切换看起来像是在同一个界面里的变化呢?答案就是: 动画。 在这种需求下,图片和xml文件的区别就出来了,由于后者能够帮助咱们更准确的实现动画。ide

方案三:自定义Preview Window加强版

废话少说,咱们先来看效果 有了动画以后,界面切换顺畅了许多。 上面的动画实现其实很是简单,无非就是放缩,移动,渐变的组合使用(我仅仅用做范例给你们参考),具体的动画代码细节就不谈了,有兴趣能够去github上看本次项目的demo,咱们重点来聊一聊思路。 在这里咱们须要明确一点的是,preview window只能是静态图,它自己是不展现动画的,咱们这里的动画,实际上是在进入欢迎页以后的展现的。明确了这一点以后,整个动画效果的实现思路其实就已经摆在咱们眼前了,那就是当界面从 Preview Window 跳转到 欢迎页 的时候,欢迎页必须首先展现一个和Preview Window如出一辙的界面,让人看起来好像界面还没切换同样,而后再慢慢切换到欢迎页。 而后,咱们再来谈谈为何设置xml的方式能够帮助咱们更准确的实现动画,就是由于要保证Preview Window和欢迎页最开始展现的界面保持绝对一致,只有经过xml的布局才是达到这种效果。 好了,启动页作到这个份儿上,应该就能够交货了,不过还有一个小问题须要你们注意的,那就是咱们给Preview Window设置的背景图若是不作处理,图片就会一直存在于内存中,因此,当咱们进入到欢迎页的时候,不要忘了把背景图设置为空:布局

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//将window的背景图设置为空
	getWindow().setBackgroundDrawable(null);
	super.onCreate(savedInstanceState);
}

复制代码到这里,关于Android启动页的相关问题就都讲完了。 点击获取本次项目的demopost

后记

  1. 这篇文章中,关于Android启动页的相关原理并无从Android framework层的代码来作出解释,不过之后写到framework层的文章时候可能会说起这里。不过我想框架层的代码可能不是你们想关注的重点,所以我认为这篇文章应该是合适的。
  2. 近期,我准备从公司离职了,想换个环境。假如小伙伴们有Android相关的offer,跪求你们给我内推一下,坐标:深圳or广州,Android开发两年,Android原生和react-native都能作,偏向原生

最后 这是最终的高清的效果图,文件太大,大家可能加载不出来,就放在最后吧。

做者:拉丁吴 连接:http://www.javashuo.com/article/p-trmkocfr-eh.html 来源:掘金 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。

相关文章
相关标签/搜索