スプラッシュ画面の実装を Android 12 以降に移行する

Android 11 以前でカスタム スプラッシュ画面を実装する場合は、アプリを SplashScreen API に移行して、Android 12 以降で正しく表示されるようにしてください。

Android 12 以降では、すべてのアプリのコールド スタートとウォーム スタートAndroid システムのデフォルトのスプラッシュ画面が適用されます。デフォルトでは、このシステム スプラッシュ画面は、アプリのランチャー アイコン要素と、テーマの windowBackground(単色の場合)を使用して作成されます。

アプリを移行しないと、Android 12 以降でのアプリの起動エクスペリエンスが低下するか、予期しない結果になる可能性があります。

  • android:windowBackground をオーバーライドするカスタムテーマを使用して既存のスプラッシュ画面を実装している場合、Android 12 以降では、カスタム スプラッシュ画面が Android システムのデフォルトのスプラッシュ画面に置き換えられます。これは、アプリで意図したエクスペリエンスではない場合があります。

  • 既存のスプラッシュ画面が専用の Activity を使用して実装されている場合、Android 12 以降を搭載したデバイスでアプリを起動すると、スプラッシュ画面が重複して、システムのスプラッシュ画面が表示され、その後に既存のスプラッシュ画面アクティビティが表示されます。

このドキュメントで説明する移行プロセスを完了することで、こうしたエクスペリエンスの低下や意図しないエクスペリエンスを回避できます。移行後、この API は起動時間を短縮し、ユーザーがスプラッシュ画面のエクスペリエンスを完全に制御できるようにして、プラットフォーム上の他のアプリとのより一貫した起動エクスペリエンスを作成します。

SplashScreen 互換性ライブラリ

SplashScreen API を直接使用することもできますが、代わりに AndroidX SplashScreen 互換性ライブラリを使用することを強くおすすめします。互換性ライブラリは SplashScreen API を使用し、下位互換性を確保して、すべての Android バージョンで一貫性のあるスプラッシュ画面を表示できるようにします。このドキュメントは、互換ライブラリを使用して作成されています。

SplashScreen API を使用して直接移行する場合、Android 11 以前のスプラッシュ画面は移行前とまったく同じように表示されます。Android 12 以降では、スプラッシュ画面は Android 12 のデザインです。

SplashScreen 互換ライブラリを使用して移行する場合は、すべてのバージョンの Android で同じスプラッシュ画面が表示されます。

スプラッシュ画面の実装を移行する

既存のスプラッシュ画面の実装を Android 12 以降に移行するには、次の手順を行います。

この手順は、移行元の実装のタイプにかかわらず適用できます。専用の Activity から移行する場合は、このドキュメントで説明するベスト プラクティスに沿って、カスタマイズされたスプラッシュ画面 Activity を適応させます。また、SplashScreen API は、専用のスプラッシュ画面アクティビティで発生する起動レイテンシも短縮します。

スプラッシュ画面を移行する手順は次のとおりです。

  1. build.gradle ファイルで、compileSdkVersion を変更し、SplashScreen 互換ライブラリを依存関係に含めます。

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. Theme.SplashScreen の親を持つテーマを作成します。postSplashScreenTheme の値を Activity で使用するテーマに設定し、windowSplashScreenAnimatedIcon の値をドローアブルまたはアニメーション化したドローアブルに設定します。その他の属性は省略可能です。

    <style name="Theme.App.Starting" parent="Theme.SplashScreen">
       <!-- Set the splash screen background, animated icon, and animation
       duration. -->
       <item name="windowSplashScreenBackground">@color/...</item>
    
       <!-- Use windowSplashScreenAnimatedIcon to add a drawable or an animated
            drawable. One of these is required. -->
       <item name="windowSplashScreenAnimatedIcon">@drawable/...</item>
       <!-- Required for animated icons. -->
       <item name="windowSplashScreenAnimationDuration">200</item>
    
       <!-- Set the theme of the Activity that directly follows your splash
       screen. This is required. -->
       <item name="postSplashScreenTheme">@style/Theme.App</item>
    </style>
    

    アイコンの下に背景色を追加する場合は、Theme.SplashScreen.IconBackground テーマを使用して windowSplashScreenIconBackground 属性を設定します。

  3. マニフェストで、開始アクティビティのテーマを、前の手順で作成したテーマに置き換えます。

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. super.onCreate() を呼び出す前に、開始アクティビティで installSplashScreen を呼び出します。

    Kotlin

    class MainActivity : Activity() {
    
       override fun onCreate(savedInstanceState: Bundle?) {
           // Handle the splash screen transition.
           val splashScreen = installSplashScreen()
    
           super.onCreate(savedInstanceState)
           setContentView(R.layout.main_activity)
    ...
    

    Java

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
             // Handle the splash screen transition.
             SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
    
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main_activity);
        }
    }
    

installSplashScreen はスプラッシュ画面オブジェクトを返します。このオブジェクトを使用して、アニメーションをカスタマイズしたり、スプラッシュ画面を長時間表示したりできます。アニメーションのカスタマイズの詳細については、スプラッシュ画面を長時間画面に表示するスプラッシュ画面を閉じるためのアニメーションをカスタマイズするをご覧ください。

カスタム スプラッシュ画面アクティビティをスプラッシュ画面に適応させる

Android 12 以降のスプラッシュ画面に移行した後は、以前のカスタム スプラッシュ画面 Activity の処理方法を決定します。次のオプションがあります。

  • カスタム アクティビティは保持するが、表示されないようにする。
  • ブランディング上の理由から、カスタム アクティビティを保持します。
  • カスタム アクティビティを削除し、必要に応じてアプリを調整してください。

カスタム アクティビティが表示されないようにする

以前のスプラッシュ画面 Activity が主にルーティングに使用されていた場合は、削除する方法を検討してください。たとえば、実際のアクティビティに直接リンクしたり、サブコンポーネントを持つ単一のアクティビティに移動したりできます。これが不可能な場合は、SplashScreen.setKeepOnScreenCondition を使用して、ルーティング アクティビティを維持したままレンダリングを停止できます。これにより、スプラッシュ画面が次のアクティビティに転送され、スムーズな遷移がサポートされます。

Kotlin

  class RoutingActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        val splashScreen = installSplashScreen()
        super.onCreate(savedInstanceState)

        // Keep the splash screen visible for this Activity.
        splashScreen.setKeepOnScreenCondition { true }
        startSomeNextActivity()
        finish()
     }
   ...
  

Java

  public class RoutingActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      SplashScreen splashScreen = SplashScreen.installSplashScreen(this);

       super.onCreate(savedInstanceState);

       // Keep the splash screen visible for this Activity.
       splashScreen.setKeepOnScreenCondition(() -> true );
       startSomeNextActivity();
       finish();
    }
  ...
  

ブランディングのためにカスタム アクティビティを維持する

ブランディングの目的で以前のスプラッシュ画面 Activity を使用する場合は、スプラッシュ画面を閉じるためのアニメーションをカスタマイズすることで、システムのスプラッシュ画面からカスタム スプラッシュ画面 Activity に遷移できます。ただし、可能であれば、このシナリオは避け、SplashScreen API を使用してスプラッシュ画面をブランディングすることをおすすめします。

ダイアログを表示する必要がある場合は、後続のカスタム スプラッシュ画面アクティビティの上に、またはシステム スプラッシュ画面の後のメイン アクティビティの上に表示することをおすすめします。

カスタム スプラッシュ画面アクティビティを削除する

一般に、スプラッシュ画面の重複を回避し、効率を高め、スプラッシュ画面の読み込み時間を短縮するために、以前のカスタム スプラッシュ画面 Activity を完全に削除することをおすすめします。冗長なスプラッシュ画面アクティビティが表示されないようにするには、さまざまな方法があります。

  • コンポーネント、モジュール、ライブラリで遅延読み込みを使用する。起動時にアプリの動作に不要なコンポーネントやライブラリの読み込みや初期化は避けてください。後でアプリで必要になるときに読み込む。

    アプリが適切に動作するために本当に必要なコンポーネントの場合は、起動時ではなく本当に必要な場合にのみ読み込むか、アプリの起動後にバックグラウンド スレッドを使用して読み込みます。Application.onCreate() はできる限り軽量化します。

    また、App Startup ライブラリを使用して、アプリの起動時にコンポーネントを初期化することもできます。その際、開始アクティビティに必要なモジュールをすべて読み込み、遅延読み込みされたモジュールが利用可能になったときにジャンクが発生しないようにしてください。

  • 少量のデータをローカルに読み込む際にプレースホルダを作成します。推奨のテーマ設定アプローチを使用し、アプリの準備が整うまでレンダリングを保留します。下位互換性のあるスプラッシュ画面を実装するには、スプラッシュ画面を長時間表示するに記載されている手順を実施します。

  • プレースホルダを表示する。ネットワーク ベースの読み込み時間が不確定なネットワーク ベースの読み込みでは、スプラッシュ画面を閉じて、非同期読み込みのプレースホルダを表示します。読み込み状態を反映するコンテンツ領域に、軽いアニメーションを適用することを検討してください。読み込まれるコンテンツ構造がスケルトン構造と一致していること、またコンテンツの読み込み時にスムーズに遷移できるようにしてください。

  • キャッシュを使用する。次の図に示すように、ユーザーが初めてアプリを起動したときに、一部の UI 要素に対して読み込みインジケーターを表示できます。ユーザーが次にアプリに戻ったとき、より新しいコンテンツを読み込んでいる間に、キャッシュに保存されたコンテンツを表示できます。

図 1.UI プレースホルダを表示しています。