スプラッシュ画面の実装を 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 が主にルーティングに使用される場合は、削除方法を検討してください。たとえば、実際のアクティビティに直接リンクしたり、サブコンポーネントを含む 1 つのアクティビティに移動したりできます。これが不可能な場合は、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 のプレースホルダを表示しています。