App-Start Teil von Android Jetpack
Die App-Startbibliothek bietet eine einfache, leistungsstarke Methode zur Initialisierung beim Start der Anwendung. Sowohl Bibliotheken- als auch App-Entwickler kann App-Start-ups nutzen, um Startsequenzen zu optimieren und die Reihenfolge der Initialisierung bei.
Anstatt separate Contentanbieter für jede Komponente zu definieren, müssen Sie können Sie mit App Startup Komponenteninitialisierer definieren, einzelnen Contentanbieter nutzen. Dadurch kann die App-Startzeit erheblich verkürzt werden.
Einrichten
Wenn Sie Jetpack Startup in Ihrer Bibliothek oder App verwenden möchten, fügen Sie Folgendes zu Ihrem Gradle hinzu. Datei:
Cool
dependencies { implementation "androidx.startup:startup-runtime:1.1.1" }
Kotlin
dependencies { implementation("androidx.startup:startup-runtime:1.1.1") }
Komponenten beim Start der App initialisieren
Bei Anwendungen und Bibliotheken müssen Komponenten häufig sofort initialisiert werden, die App gestartet wird. Sie können diesen Bedarf erfüllen, indem Sie Contentanbieter nutzen, Initialisierung jeder Abhängigkeit, aber die Instanziierung von Contentanbietern ist teuer. und die Startreihenfolge unnötig verlangsamen. Außerdem kann Android initialisiert Contentanbieter in einer unbestimmten Reihenfolge. Das App-Start-up bietet leistungsstärkere Möglichkeit, Komponenten beim Start der App zu initialisieren, ihre Abhängigkeiten zu definieren.
Um mithilfe des App-Starts Komponenten automatisch beim Start zu initialisieren, müssen Sie Definieren Sie einen Komponenteninitialisierer für jede Komponente, die die App zum Initialisieren.
Komponenteninitialisierer implementieren
Sie definieren jeden Komponenteninitialisierer, indem Sie eine Klasse erstellen, die den
Initializer<T>
-Schnittstelle.
Diese Schnittstelle definiert zwei wichtige Methoden:
- Die Methode
create()
, die alle erforderlichen Vorgänge zum Ausführen Initialisieren der Komponente und gibt eine Instanz vonT
zurück. - Die Methode
dependencies()
, die eine Liste der anderenInitializer<T>
-Objekte, von denen der Initialisierer abhängig ist. Sie können diese um die Reihenfolge zu steuern, in der die App die Initialisierer beim Start ausführt.
Angenommen, Ihre App ist abhängig von
WorkManager
und muss
beim Start zu initialisieren. Definieren Sie eine WorkManagerInitializer
-Klasse, die
implementiert 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(); } }
Die Methode dependencies()
gibt eine leere Liste zurück, da WorkManager
dies nicht
von anderen Bibliotheken abhängen.
Angenommen, Ihre App ist auch von einer Bibliothek namens ExampleLogger
abhängig, die in
ist von WorkManager
abhängig. Diese Abhängigkeit bedeutet, dass Sie sicherstellen müssen,
dass App Startup zuerst WorkManager
initialisiert. Definieren Sie ein
ExampleLoggerInitializer
-Klasse, die Initializer<ExampleLogger>
implementiert:
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); } }
Da Sie WorkManagerInitializer
in die Methode dependencies()
aufnehmen, wird in der App
Beim Start wird WorkManager
vor dem ExampleLogger
initialisiert.
Manifesteinträge einrichten
Das App-Start-up umfasst einen speziellen Contentanbieter namens InitializationProvider
die zum Erkennen und Aufrufen Ihrer Komponenteninitialisierer verwendet wird. App-Start
erkennt Komponenteninitialisierer, indem zuerst nach einem <meta-data>
-Eintrag gesucht wird
unter dem Manifesteintrag InitializationProvider
. Anschließend ruft App-Start die
dependencies()
-Methoden für alle Initialisierer, die bereits erkannt wurden.
Damit ein Komponenteninitialisierer von einer App erkannt werden kann, Beim Start muss eine der folgenden Bedingungen erfüllt sein:
- Der Komponenteninitialisierer hat einen entsprechenden
<meta-data>
-Eintrag unter derInitializationProvider
-Manifesteintrag. - Der Komponenteninitialisierer wird in der Methode
dependencies()
aus einer Initialisierer, der bereits sichtbar ist.
Sehen wir uns noch einmal das Beispiel mit WorkManagerInitializer
und
ExampleLoggerInitializer
. Damit App-Start-ups diese Apps erkennen können
Initialisieren, fügen Sie der Manifestdatei Folgendes hinzu:
<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>
Sie müssen keinen <meta-data>
-Eintrag für WorkManagerInitializer
hinzufügen,
da WorkManagerInitializer
eine Abhängigkeit von ExampleLoggerInitializer
ist.
Das heißt, wenn ExampleLoggerInitializer
sichtbar ist, gilt das auch für die Suche.
WorkManagerInitializer
.
Das Attribut tools:node="merge"
sorgt dafür, dass die Manifestzusammenführung
widersprüchliche Einträge ordnungsgemäß beseitigt.
Lint-Prüfungen ausführen
Die Bibliothek für App-Start-ups enthält eine Reihe von Lint-Regeln, mit denen Sie prüfen können,
ob Sie Ihre Komponenteninitialisierer
richtig definiert haben. Sie können
führen Sie ./gradlew :app:lintDebug
über die Befehlszeile aus.
Komponenten manuell initialisieren
Wenn Sie „App-Start“ verwenden, verwendet das Objekt InitializationProvider
normalerweise einen
Entität aufgerufen
Von AppInitializer
an
automatisch beim Start von Anwendungen
Komponenteninitialisierer erkennen und ausführen.
Sie können aber auch direkt AppInitializer
verwenden, um
und initialisieren Sie Komponenten,
die Ihre App beim Start nicht benötigt. Dies wird als
verzögerte Initialisierung und kann dabei helfen, die Startkosten zu minimieren.
Deaktivieren Sie zuerst die automatische Initialisierung für alle Komponenten, manuell zu initialisieren.
Automatische Initialisierung für eine einzelne Komponente deaktivieren
Um die automatische Initialisierung für eine einzelne Komponente zu deaktivieren, entfernen Sie den
<meta-data>
-Eintrag für den Initialisierer dieser Komponente aus dem Manifest.
Wenn Sie beispielsweise Folgendes zur Manifestdatei hinzufügen, wird die automatische
Initialisierung für 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>
Sie verwenden tools:node="remove"
im Eintrag, anstatt den Eintrag einfach zu entfernen
um sicherzustellen, dass das Zusammenführungstool den Eintrag auch aus allen anderen
Manifestdateien zusammengeführt.
Automatische Initialisierung für alle Komponenten deaktivieren
Entfernen Sie den gesamten Eintrag für, um die gesamte automatische Initialisierung zu deaktivieren.
InitializationProvider
aus dem Manifest:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
Komponenteninitialisierer manuell aufrufen
Ist die automatische Initialisierung für eine Komponente deaktiviert, können Sie
AppInitializer
, um diese Komponente und ihre Abhängigkeiten manuell zu initialisieren.
Mit dem folgenden Code wird beispielsweise AppInitializer
aufgerufen und manuell initialisiert.
ExampleLogger
:
Kotlin
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer::class.java)
Java
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer.class);
Dadurch wird WorkManager
auch von App Startup initialisiert, da WorkManager
eine Abhängigkeit von ExampleLogger
.
Feedback geben
Wir freuen uns über dein Feedback und deine Ideen:
- Problemverfolgung
- Melde Probleme, damit wir sie beheben können.
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- App-Architektur: Datenschicht – Aufgaben mit WorkManager planen – Android-Entwickler
- App-Architektur: Datenschicht – Datenspeicher – Android-Entwickler