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 は、専用のスプラッシュ画面アクティビティで発生する起動レイテンシも短縮します。
スプラッシュ画面を移行する手順は次のとおりです。
build.gradle
ファイルで、compileSdkVersion
を変更し、SplashScreen
互換ライブラリを依存関係に含めます。build.gradle android { compileSdkVersion 31 ... } dependencies { ... implementation 'androidx.core:core-splashscreen:1.0.0-beta02' }
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
属性を設定します。マニフェストで、開始アクティビティのテーマを、前の手順で作成したテーマに置き換えます。
<manifest> <application android:theme="@style/Theme.App.Starting"> <!-- or --> <activity android:theme="@style/Theme.App.Starting"> ...
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 ライブラリを使用して、アプリの起動時にコンポーネントを初期化することもできます。その際、開始アクティビティに必要なモジュールをすべて読み込み、遅延読み込みされたモジュールが利用可能になったときにジャンクが発生しないようにしてください。
少量のデータをローカルに読み込む際にプレースホルダを作成します。推奨のテーマ設定アプローチを使用し、アプリの準備が整うまでレンダリングを保留します。下位互換性のあるスプラッシュ画面を実装するには、スプラッシュ画面を長時間表示するに記載されている手順を実施します。
プレースホルダを表示する。ネットワーク ベースの読み込み時間が不確定なネットワーク ベースの読み込みでは、スプラッシュ画面を閉じて、非同期読み込みのプレースホルダを表示します。読み込み状態を反映するコンテンツ領域に、軽いアニメーションを適用することを検討してください。読み込まれるコンテンツ構造がスケルトン構造と一致していること、またコンテンツの読み込み時にスムーズに遷移できるようにしてください。
キャッシュを使用する。次の図に示すように、ユーザーが初めてアプリを起動したときに、一部の UI 要素に対して読み込みインジケーターを表示できます。ユーザーが次にアプリに戻ったとき、より新しいコンテンツを読み込んでいる間に、キャッシュに保存されたコンテンツを表示できます。