美文网首页
SplashActivity 的最佳实践

SplashActivity 的最佳实践

作者: zac4j | 来源:发表于2018-06-18 17:15 被阅读100次

    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);
        // ...
      }
    }  
    

    这种方法的注意事项:

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

    相关文章

      网友评论

          本文标题:SplashActivity 的最佳实践

          本文链接:https://www.haomeiwen.com/subject/exbneftx.html