Android应用框架决定了,在我们常规的Android应用启动时,会有一段时间的黑屏。这主要是机制本身决定的。另外,如果你在onCreate函数中做耗时操作,会增加黑屏的时间。
从Activity启动的原理分析,我们可以了解到。首先启动起来的黑屏,其实是一个窗口(startingwindow)。如果我们为这个window加一个背景,就可以在第一时间用这个图取代黑屏。需要注意的是,startingwindow是针对一个Task而言的。Task内部的Activity切换不会出现starting window,因此也不会黑屏。
一般程序可能不止一个程序入口。也就是说,Task启动的第一个Activity可能是不同的。我们最好针对每个Activity做一个启动背景图,已达到更好的用户体验。
具体如何实现呢?一般情况很简单。一句话概括就是:为每个入口Activity写一个Theme,指定它的windowbackground。如何为一个Activity指定一个自定义的Theme呢?方法如下:
在drawable资源文件夹中添加启动图片资源文件。注意横竖屏。横屏可以放在默认的drawable文件夹中,竖屏图片应该与横屏图片同名,放在drawable-port文件夹中。
在your_project/res/values/styles.xml中加入自定义Activity的Theme,如下所示:
<style name="style_xxx_launch_add_account" parent="@android:style/Theme"> <item name="android:windowBackground"> @drawable/launch_add_accont </item> <item name="android:windowNoTitle"> true </item> </style>
其中drawable属性,需要指定你的启动图片。WindowNoTitle根据你的需要选择需不需要指定。name属性自己指定。
定义好Theme后,就该为对应的Activity绑定Theme了。这个代码主要在Manifest中实现:
在Activity中加上以下属性:android:theme="@style/style_xxx_launch_add_account"
特殊情况:
一般情况通过这种方式就可以达到要求。但是也有一些特殊情况,大家可以了解一下。有些程序(例如电子邮件),它是通过一个没有界面的Activity作为统一入口,即(onCreate函数中没有setContentView,或者ContentView中没有内容)。然后此Activity再在代码中通过判断一些条件,启动相应的不同的Activity。
这种情况,由于Task的第一个Activity为一个空白的Activity,而由这个Activity启动其他Activity不会出现starting window。所以,按上面那种方式,就只能为第一个空白Activity指定window图片,后面的Activity指定window图片无效。
如果一定要使用不同的window图片启动,那就必须采用一些特殊的方法:
一、Task分离
由于一个Task只能有一个starting window,为了让后面的Activity有启动window,就需要将第一个Activity与其他Activity在Task上分离。这个可以在Manfest中手动指定,属性是android:taskAffinity,我们将application指定为一个task,将第一个Activity指定为另一个task。
二、删除第一个Activity的Task记录
由于一个程序被我们手动分为了两个Task。这样就会导致在多任务切换界面出现两个相同包名的任务。这很明显是不合理的。因为第一个Activity对应的Task其实只是一个空壳,我们应该将它在Task记录中去掉。
我们可以在Manifest中为这个Activity设置属性android:excludeFromRecents="true"。它的意义就是指明此Task不会出现在Recent列表中。
三、设置Activity不可见
我们设置了后面启动的Activity的启动背景图,但是第一个空白Activity还是会启动,出现黑框口。为了不让黑窗口出现,我们可以将第一个空白Activity设置为不可见。即设置主题为android:theme="@android:style/Theme.NoDisplay"。