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

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

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

カスタム スプラッシュ画面 Activity をスプラッシュ画面に適応させる

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 プレースホルダを表示しています。