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

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

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

アプリを移行しない場合、Android 12 以降でのアプリ起動において、エクスペリエンスの低下や予期しないエクスペリエンスが生じる可能性があります。

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

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

このようなエクスペリエンスの低下や予期しないエクスペリエンスを回避するために、このドキュメントで説明する移行プロセスを完了してください。この 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 プレースホルダの表示。