アプリの起動 Android Jetpack の一部。
App Startup ライブラリを使用すると、簡単かつ効率的に初期化できます。 自動的に作成されます。ライブラリ デベロッパーとアプリ デベロッパーの両方 App Startup を使用して、起動シーケンスを簡素化し、順序を明示的に設定できます。 必要ありません。
コンポーネントごとに個別のコンテンツ プロバイダを定義するのではなく、 初期化では、App Engine の初期化関数を 提供します。これにより、アプリの起動時間が大幅に短縮されます。
設定
ライブラリまたはアプリで Jetpack Startup を使用するには、Gradle に以下を追加します ファイル:
Groovy
dependencies { implementation "androidx.startup:startup-runtime:1.2.0" }
Kotlin
dependencies { implementation("androidx.startup:startup-runtime:1.2.0") }
アプリ起動時にコンポーネントを初期化する
アプリやライブラリでは多くの場合、実行時にコンポーネントを アプリが起動しますこのニーズを満たすには、コンテンツ プロバイダを使用して 各依存関係を初期化するが、コンテンツ プロバイダのインスタンス化にはコストがかかる 起動シーケンスが不必要に遅くなる可能性があります。また、Android は 不確定の順序でコンテンツ プロバイダを初期化します。アプリの起動は アプリ起動時に明示的にコンポーネントを初期化 依存関係を定義します。
アプリの起動を使用して起動時にコンポーネントを自動的に初期化するには、以下を行う必要があります。 アプリが実行する必要のあるコンポーネントごとに、コンポーネントイニシャライザを定義します。 初期化します。
コンポーネントイニシャライザを実装する
各コンポーネント初期化子を定義するには、 Initializer<T>
インターフェース。 このインターフェースでは、次の 2 つの重要なメソッドを定義します。
create()
メソッド。これには、 コンポーネントを初期化し、T
のインスタンスを返します。dependencies()
メソッド。このメソッドは、他の Pod のリストを返します。 イニシャライザが依存するInitializer<T>
オブジェクト。こちらの メソッドを使用して、起動時にアプリがイニシャライザを実行する順序を制御します。
たとえば、アプリが WorkManager
。ただし、 初期化する必要があります。WorkManagerInitializer
クラスを定義する Initializer<WorkManager>
を実装します。
Kotlin
// Initializes WorkManager. class WorkManagerInitializer : Initializer<WorkManager> { override fun create(context: Context): WorkManager { val configuration = Configuration.Builder().build() WorkManager.initialize(context, configuration) return WorkManager.getInstance(context) } override fun dependencies(): List<Class<out Initializer<*>>> { // No dependencies on other libraries. return emptyList() } }
Java
// Initializes WorkManager. class WorkManagerInitializer implements Initializer<WorkManager> { @Override public WorkManager create(Context context) { Configuration configuration = Configuration.Builder().build(); WorkManager.initialize(context, configuration); return WorkManager.getInstance(context); } @Override public List<Class<Initializer<?>>> dependencies() { // No dependencies on other libraries. return emptyList(); } }
WorkManager
は存在しないため、dependencies()
メソッドは空のリストを返します。 他のライブラリに依存していることを示します。
アプリが ExampleLogger
というライブラリにも依存しているとします。このライブラリは、 ターンは WorkManager
に依存します。つまり、この依存関係は、アプリケーション コードを アプリが WorkManager
を最初に初期化していること。目標を Initializer<ExampleLogger>
を実装する ExampleLoggerInitializer
クラス:
Kotlin
// Initializes ExampleLogger. class ExampleLoggerInitializer : Initializer<ExampleLogger> { override fun create(context: Context): ExampleLogger { // WorkManager.getInstance() is non-null only after // WorkManager is initialized. return ExampleLogger(WorkManager.getInstance(context)) } override fun dependencies(): List<Class<out Initializer<*>>> { // Defines a dependency on WorkManagerInitializer so it can be // initialized after WorkManager is initialized. return listOf(WorkManagerInitializer::class.java) } }
Java
// Initializes ExampleLogger. class ExampleLoggerInitializer implements Initializer<ExampleLogger> { @Override public ExampleLogger create(Context context) { // WorkManager.getInstance() is non-null only after // WorkManager is initialized. return ExampleLogger(WorkManager.getInstance(context)); } @Override public List<Class<Initializer<?>>> dependencies() { // Defines a dependency on WorkManagerInitializer so it can be // initialized after WorkManager is initialized. return Arrays.asList(WorkManagerInitializer.class); } }
dependencies()
メソッドに WorkManagerInitializer
が含まれているため、アプリは Startup は、ExampleLogger
の前に WorkManager
を初期化します。
マニフェスト エントリをセットアップする
アプリの起動には、InitializationProvider
という特別なコンテンツ プロバイダが含まれています。 コンポーネントイニシャライザを検出して呼び出すために使用することができます。アプリの起動 最初に <meta-data>
エントリを確認することで、コンポーネント初期化子を検出します。 これは InitializationProvider
マニフェスト エントリの下にあります。次に、App Startup が呼び出し すでに検出されているイニシャライザの dependencies()
メソッド。
つまり、コンポーネント初期化子をアプリが検出できるようにするには、 起動するには、次のいずれかの条件を満たす必要があります。
- コンポーネント初期化子には、対応する
<meta-data>
エントリがInitializationProvider
マニフェスト エントリ。 - コンポーネント初期化子は、
dependencies()
メソッドの すでに検出可能なイニシャライザが含まれています。
もう一度、WorkManagerInitializer
と ExampleLoggerInitializer
。アプリのスタートアップが イニシャライザを使用するには、マニフェスト ファイルに次の行を追加します。
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <!-- This entry makes ExampleLoggerInitializer discoverable. --> <meta-data android:name="com.example.ExampleLoggerInitializer" android:value="androidx.startup" /> </provider>
WorkManagerInitializer
に <meta-data>
エントリを追加する必要はありません。 これは、WorkManagerInitializer
が ExampleLoggerInitializer
の依存関係であるためです。 つまり、ExampleLoggerInitializer
が検出可能な場合は、それも検出されます。 WorkManagerInitializer
。
tools:node="merge"
属性を使用すると、マニフェスト マージが確実に統合されます。 ツールで競合するエントリを適切に解決します。
lint チェックを実行する
App Startup ライブラリには、一連の lint ルールが含まれており、これを使用して コンポーネントイニシャライザが正しく定義されているかどうかを確認できます。次を実行します。 これらの lint チェックを行うには、コマンドラインから ./gradlew :app:lintDebug
を実行します。
コンポーネントを手動で初期化する
通常、アプリの起動を使用する場合、InitializationProvider
オブジェクトは 呼び出される AppInitializer
から アプリケーションの起動時にコンポーネント初期化子を自動的に検出して実行します。 ただし、AppInitializer
を直接使用して、 アプリの起動時に必要のないコンポーネントを初期化する。これを 遅延初期化により、起動コストを最小限に抑えることができます。
まず、必要なコンポーネントについて自動初期化を無効にする必要があります。 手動で初期化する必要はありません。
個々のコンポーネントで自動初期化を無効にする
単一のコンポーネントの自動初期化を無効にするには、 マニフェストのそのコンポーネントのイニシャライザの <meta-data>
エントリ。
たとえば、マニフェスト ファイルに次の行を追加すると、自動 ExampleLogger
の初期化:
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <meta-data android:name="com.example.ExampleLoggerInitializer" tools:node="remove" /> </provider>
エントリを単純に削除するのではなく、エントリで tools:node="remove"
を使用している 統合ツールによって、他のすべてのタブからもエントリが削除される 統合マニフェストファイルが生成されます
すべてのコンポーネントで自動初期化を無効にする
自動初期化をすべて無効にするには、 マニフェストから InitializationProvider
を削除します。
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" tools:node="remove" />
コンポーネントイニシャライザを手動で呼び出す
コンポーネントの自動初期化が無効になっている場合は、 AppInitializer
を使用して、そのコンポーネントとその依存関係を手動で初期化します。
たとえば、次のコードは AppInitializer
を呼び出して、 ExampleLogger
:
Kotlin
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer::class.java)
Java
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer.class);
その結果、WorkManager
が初期化されるため、App Startup も WorkManager
を初期化します。 ExampleLogger
の依存関係。
フィードバックを送信
以下のリソースを通じてフィードバックやアイデアをお寄せください。
- Issue Tracker
- Google がバグを修正できるよう問題を報告します。
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- アプリ アーキテクチャ: データレイヤー - WorkManager でタスクのスケジュールを設定する - Android デベロッパー
- アプリ アーキテクチャ: データレイヤー - DataStore - Android デベロッパー