Android 12におけるスプラッシュスクリーン

こんにちは。エキサイト株式会社 Androidエンジニアの克です。

Androidアプリでは、起動時に最初の画面が表示されるまで多少の時間がかかり、真っ白の画面がしばらく続いてしまうということがよくあります。

そのため、最初の画面が表示されるまでアプリのロゴを表示しておくというのはよく使われる手法です。(以下スプラッシュスクリーンと呼称)

Android 12ではこのスプラッシュスクリーンにより拡張性が加わりましたが、注意しなければならない点もあったので紹介させていただこうと思います。

※ 今回紹介する内容は Android 12 Beta におけるものです。正式版では仕様が変わっている可能性もあるため詳細については公式のドキュメントを参照してください。

Android 7までの実装

公式で推奨しているようなやり方は特にはありませんでしたが、概ね下記のようにテーマの差し替えという形で実装されてきました。

<!-- theme.xml -->
<resources>

    <!-- 通常のテーマ -->
    <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar" />

    <!-- スプラッシュスクリーンのテーマ -->
    <style name="AppTheme.Splash">
        <item name="android:windowBackground">@drawable/splash_screen</item>
    </style>

</resources>
<!-- splash_screen.xml -->
<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">

    <!-- 画像をそのまま使うと全体に引き伸ばされてしまうので、layer-listを使う -->

    <item>
        <color android:color="#FFF" />
    </item>

    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/splash_image" />
    </item>

</layer-list>
<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.Splash"> <!-- スプラッシュスクリーンのテーマを指定  -->
    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
// MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // スプラッシュスクリーンのテーマから通常のテーマに戻す
        setTheme(R.style.AppTheme)

        setContentView(R.layout.activity_main)
    }
}

こうすることで最初の画面が立ち上がるまではスプラッシュスクリーンが表示され、立ち上がった後は通常の表示に切り替わります。

Android 8からの実装

Android 8からは、スプラッシュスクリーン用のAPIとして windowSplashscreenContentが追加されました。

こちらをテーマに設定することで、テーマの切り替えをしなくても自動でスプラッシュスクリーンの表示と非表示をやってくれます。

<resources>

    <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="android:windowSplashscreenContent">@drawable/splash_screen</item>
    </style>

</resources>

Android 12からの実装

Android 12の端末で起動されたアプリは、なんとデフォルトでアプリアイコンがスプラッシュスクリーンとして表示されます。

そのためアプリアイコンをそのままスプラッシュスクリーンに表示するだけの場合は実装は不要です。

別の画像を表示したい場合はAndroid 8からの場合と同様に windowSplashscreenContentを使用します。

Android 12では、他にもSplash screensという形で専用のAPI群が追加され、スプラッシュスクリーンの細かい表示内容や表示時間などのカスタマイズが可能になりました。 developer.android.com

Android 12での注意点

デフォルトでスプラッシュスクリーンが表示されることは喜ばしいことでもありますが、注意点として windowBackgroundで画像を表示していた場合については無視されます。

また、テーマの設定ではなくスプラッシュスクリーン用の画面を別途用意していた場合、スプラッシュスクリーンが2回表示されてしまうことにも繋がります。

さらに、これはtargetSdkVersionAndroid 12未満に設定されている場合でも適用されます。

よってスプラッシュスクリーンを自前で実装しているアプリについては、Android 12の正式版がリリースされる前に動作を確認しておいたほうがよいでしょう。

まとめ

昔はスプラッシュスクリーンの実装方法も統一されておらず、無駄に長い時間ユーザーを拘束してしまうような実装になっている場合もありました。

OSが新しくなるにつれて画一された実装方式になり、よりシンプルで拡張性のある表現をすることができるようになってきています。

スプラッシュスクリーンはブランドイメージを強調するという側面もあるかもしれませんが、ユーザーはロゴを見るためにアプリを起動するのではないということを念頭に置き、使いやすいアプリにしていきたいですね。