Android Splash 的最佳实践

如何通过品牌主题切换有效的利用 App 冷启动时间
Pro-tip by Ian Lake

App 的冷启动时间取决于它的尺寸大小以及你在它的 Application 类的 onCreate() 方法内的所部署任务的多少(我希望尽可能的少),从用户在屏幕上点击你的 App icon 开始到它的 Launcher ActivityonCreate() 方法被调用。这段时间内 WindowManager 将尽它最大努力利用你设定的 Theme 元素如 background 以及 status bar color 去绘制 占位UI ( placeholder )。

但是 background 并不一定需要是固定的颜色,它可以作为一个个性化利用展示品牌广告主题的机会,而不会增加用户打开 App 展示 启动屏幕 时间。合理实现启动屏幕的关键是自定义 theme 覆写 android:windowBackground,然后在 Lanucher Activitysuper.onCreate() 方法被调用前,将自定义的 theme 替换为标准的 App.Theme.

假设你的 res/values/styles.xml 文件已经有一个 Theme 叫做 AppTheme,为它设定 Launcher 主题:

<resources>
  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
  </style>
  <style name="AppTheme.Launcher">
    <item name="android:windowBackground">@drawable/launch_screen</item>
  </style>
<resources>

这样 Launcher Theme 将继承所有 AppTheme 的属性,除了自定义的
android:windowBackground ,对于其他属性,例如在 Android 5.0+ 设备上代表 status bar 颜色的 colorPrimaryDark 属性,也可以尝试覆写,在 LauncherTheme 和 AppTheme 之间完成良好的用户体验。

对于res/drawable/launch_screen 文件不能仅仅是一张简单的图片,它还需要拉伸以填充到整个屏幕,因此可以利用 XML 文件描述:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
  <!-- The background color, preferably the same as your normal theme -->
  <item android:drawable="@android:color/white"/>
  <!-- Your product logo - 144dp color version of your app icon -->
  <item>
    <bitmap
      android:src="@drawable/product_logo_144dp"
      android:gravity="center"/>
  </item>
</layer-list>

需要注意的设定 android:opacity=”opaque” 属性,是为了防止在主题切换之间会闪现的黑屏。

然后在 AndroidManifest.xml 中设定了 Launcher Activity 的主题:

<activity
  android:theme="@style/AppTheme.Launcher" 
</activity>

最后需要在 Launcher Activitysuper.onCreate() 之前调用 onCall() 方法:

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceStated) {
    // Make sure this is before calling super.onCreate
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceStated);
    // ...
  }
}  

这种方法的注意事项:
+ 无 Splash Activity - 设定专用的 Splash Activity 去展示闪屏广告
+ 无人为延迟 - 闪屏耗时仅为切换主题所消耗的时间
+ 无额外的重绘(overdraw) - 重设主题只是移除了在原 AppTheme 背景上的自定义的 android:windowBackground 图层。
+ 只为 Launcher Activity - 这种方法并不适合深度链接到你的 app (内的Activity) 或者链接到一个 URI,而只为了启动完毕到主页面 - 关键点是尽可能缩短 app 的死亡时间,不是打搅用户。
+ 越快越好 - 保持你的 app 精简以及启动时执行最少的任务对于用户体验是至关重要的,即使这意味着更短的闪屏广告展示时间 - 将 app 内容尽快展示应该是第一优先级的任务。
+ 注意过渡 - 注意切换主题时颜色以及其他状态的改变能做到无缝衔接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值