当打开一个Activity时,若是这个Activity所属的应用尚未在运行,系统会为这个Activity所属的应用建立一个进程,但进程的建立与初始化都须要时间,在这个动做完成以前系统要作什么呢?若是没有任何反应的话,若是程序初始化的时间很长,用户可能还觉得没有点到相应的位置。但此时所启动的程序还没初始化完,既没法显示程序,又不能停在原处不作任何动做,怎么办?这就有了Starting Window的概念,也能够称之为Preview Window。html
Starting Window就是一个用于在应用程序进程建立并初始化成功前显示的临时窗口,拥有的Window Type是TYPE_APPLICATION_STARTING。在程序初始化完成前显示这个窗口,以告知用户系统已经知道了他要打开这个应用并作出了响应,当程序初始化完成后显示用户UI并移除这个窗口。android
这个Starting Window咱们都见过,不过可能没留意过,其实就是开启程序时黑屏的那个窗口,够丑的。不过也没办法,每一个程序的界面都不是同的,系统只有默认显示一个很简单的窗口了。app
若是所谓的Starting Window只是一个黑屏的窗口的话,那这个功能未免也太鸡肋了。其实系统是能够根据每一个程序的Theme显示不一样的样子的。布局
启动应用的时候,虽然咱们的程序还没初始化,但程序内的组件但是在程序安装的时候就被系统分析注册了的。咱们能够针对每一个Application和Activity设置不一样的Theme,系统就是根据这个Theme初始化Starting Window的。Window布局的顶层是DecorView,Starting Window就是显示一个空的可是应用了Activity指定的Theme(若是Activity没有指定就用Application的)的DecorView。htm
在Theme中能够指定不少东西,如ActionBar的样式,窗口的背景,Activity的图标等,经过给Activity指定Theme,系统就能够在咱们的应用初始化完成以前将这个Theme应用到Starting Window,这样看起来就像咱们的应用已经启动起来了,只是数据内容尚未初始化好。进程
因此,若是你的Activity的背景只是简单的纯色的话,最好直接经过Theme把它应用到Activity的Background,而不是设置为顶层Layout的背景,若是真的须要给顶层Layout设置背景,也能够给android:windowBackground设置一个和Activity UI类似的背景,为了防止Overdraw,在Activity的onCreate中经过setWindowBackground()再把窗口的背景设置为null。图片
系统在显示Activity前显示一个Starting Window仅发生在须要为启动这个Activity建立进程时,通常状况下是一个应用的入口Activity(包含Lanuncher中显示的图标进入的Activity及被其余应用调用的Activity)。get
还有一种状况就是应用内有多个进程的状况(经过android:process),好比你的程序须要用单独的进程查看图片,当从你的应用的主进程进入图片浏览的Activity时,系统就会建立图片浏览的进程,若是图片浏览的Activity的须要使用的图标和Application指定的图标不同的话就要注意了,系统显示图片进程中的Activity的Starting Window时不会使用这个Activity在Manifest中经过android:icon指定的图标,而只会使用Theme中指定的图标,若是没为这个Activity指定一个Theme或所指定的Theme中没有指定android:icon的话,系统会使用Application标签指定的android:icon,结果就是会看到Starting Window中显示一个图标,当Activity加载完后图标会变为Activity在Manifest中指定的android:icon,有一个变化的过程。it