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

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

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

アプリを移行しない場合、Android 12 と パフォーマンスが低下したり、意図しない結果が生じたりする可能性があります。

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

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

このようなエクスペリエンスの低下や予期しないエクスペリエンスを回避するために、このドキュメントで説明する移行プロセスを完了してください。この API に移行すると、起動時間が短縮されるとともに、スプラッシュ画面を制御下に置き、プラットフォーム上の他のアプリと一貫した起動エクスペリエンスを実現できるようになります。

SplashScreen 互換性ライブラリ

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

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

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

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

既存のスプラッシュ画面を移行するには、次の手順を行います。 実装する必要があります。

この手順は、移行元の実装のタイプにかかわらず適用できます。専用の 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 ライブラリ: コンポーネントを初期化する 自動的に最適化されます。その際は、常にすべての Pod の読み込みを 必要とせず、起動時のアクティビティでジャンクが発生しないように 遅延読み込みされたモジュールが利用可能になります。

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

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

  • キャッシュを使用する。ユーザーが初めてアプリを開いたときに、 一部の UI 要素の読み込みインジケーターを確認できます(次の図を参照)。ユーザーが次にアプリに戻った際には、最新のコンテンツを読み込む間、このキャッシュに保存されたコンテンツを表示できます。

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