应用程序防黑屏启动图片添加方法

Android应用框架决定了,在我们常规的Android应用启动时,会有一段时间的黑屏。这主要是机制本身决定的。另外,如果你在onCreate函数中做耗时操作,会增加黑屏的时间。

       从Activity启动的原理分析,我们可以了解到。首先启动起来的黑屏,其实是一个窗口(startingwindow)。如果我们为这个window加一个背景,就可以在第一时间用这个图取代黑屏。需要注意的是,startingwindow是针对一个Task而言的。Task内部的Activity切换不会出现starting window,因此也不会黑屏。

       一般程序可能不止一个程序入口。也就是说,Task启动的第一个Activity可能是不同的。我们最好针对每个Activity做一个启动背景图,已达到更好的用户体验。

       具体如何实现呢?一般情况很简单。一句话概括就是:为每个入口Activity写一个Theme,指定它的windowbackground。如何为一个Activity指定一个自定义的Theme呢?方法如下:

添加启动图片资源:

在drawable资源文件夹中添加启动图片资源文件。注意横竖屏。横屏可以放在默认的drawable文件夹中,竖屏图片应该与横屏图片同名,放在drawable-port文件夹中。

自定义Theme:

在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属性自己指定。

修改Manifest,将Activity与Theme对应:

定义好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"。


你可能感兴趣的:(框架,android,application,任务)