Android学习:制作启动界面遇到的种种问题


几乎每个 App 都有自己的启动页面,我个人认为启动页面的作用就是加载一些耗时的资源,现在很多 App 的启动界面主要是为了广告。当然我也觉得连启动页面都没有,显得自己的 App 很没有逼格,一个简洁或炫酷的启动页面会给整个 App 带来很高的逼格。

启动页面的原理

启动页面也就是在主 Activity 加载之前,加载一个替代的 Activity。也就是说之前的主加载 MainActivity 替换成 LaunchActivity,(当然也不是每个项目都有叫 MainActivity 的 Activity)然后再在这个 LaunchActivity 上添加需要的控件即可,代码如下。

<activity android:name=".LaunchActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".MainActivity" />

上面的代码是最精简的代码,后续提到的代码会在后面补上。

出现黑白屏问题

按照上面的的代码,我在 LaunchActivity 上添加了一张带有 LOGO 的图片,但是在实际调试的时候,App 启动后会出现短暂的白屏,然后才会跳到启动界面。因为我用的是大学期间的小米4调试的,开始以为是手机硬件落伍导致的卡顿,在换了公司的新安卓机以后,也会出现这样的问题。

上网调查原因是这样的:

因为从用户点击 App 图标进去到第一个 Activity 前,系统会经过一系列的 Framework 层操作,其中包括 Application 的初始化,如果在 Application 初始化过程中做了过多操作,就会导致应用已经启动了却迟迟没有界面显示出来,这时候就是所谓的白屏或黑屏状态。

对于这样的状况也有补救措施,就是对启动页面的背景下手,将其设置为透明或者设置一张背景图片。

将启动页面设置为透明

首先定义一个主题样式,在 style.xml 中增加如下代码:

<style name="AppTheme.Launch" parent="AppTheme.Launch">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
</style>

然后设置 Manifest.xml,在为启动页面设置该主题:

<activity android:name=".LaunchActivity" android:theme="@style/AppTheme.Launch"> ... </activity>

Note:因为启动页面变成了透明的,所以点击启动图标后,原白屏的那一瞬间显示的则是手机桌面的样子,给人的感觉就像卡顿、迟钝一样。当前的《天天酷跑》就是采用的这种方案。

将启动页面设置一张背景图片

这个也很简单,更改 style.xml 设置以下主题代码:

<style name="AppTheme.Launch" parent="AppTheme.Launch">
    <item name="android:windowBackground">@drawable/launch_bg</item>
</style>

至于图片的问题在这里先不阐述,但是图片尺寸比例一定要适配,否则会出现拉伸的效果,影响美观。

Note:当前的“饿了么”客户端就是采用的这种方案。

发现状态栏不适配

如果按照上述的步骤去做,会发现加载页面不是全屏的。换句话说,就是状态栏的颜色和页面的内容格格不入。这时候只需要将 LaunchActivity 设置成全屏模式即可,在 style.xml 中的主题上加上以下属性:

<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>



版权声明

本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。