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

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

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 のデザインが適用されます。

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

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

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

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

スプラッシュ画面を移行するには:

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

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta01'
    }
    
  2. Theme.SplashScreen を親に持つテーマを作成し、Activity が使用するテーマとして postSplashScreenTheme の値を、ドローアブルまたはアニメーション化したドローアブルとして 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 either a drawable or an
       // animated drawable. One of these is required.
       <item name="windowSplashScreenAnimatedIcon">@drawable/...</item>
       <item name="windowSplashScreenAnimationDuration">200</item>  # Required for
                                                                    # animated icons
    
       // Set the theme of the Activity that directly follows your splash screen.
       <item name="postSplashScreenTheme">@style/Theme.App</item>  # Required.
    </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 プレースホルダの表示