SplashActivity 的最佳实践

2018-06-18  本文已影响100人  zac4j

Use cold start time effectively with a branded launch theme
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);
    // ...
  }
}  

这种方法的注意事项:

上一篇下一篇

猜你喜欢

热点阅读