Uygulama Başlatma Android Jetpack'in bir parçasıdır.
Uygulama Başlatma kitaplığı, uygulama başlatılırken bileşenleri başlatmak için basit ve etkili bir yol sağlar. Hem kitaplık geliştiricileri hem de uygulama geliştiricileri, başlatma sıralarını kolaylaştırmak ve başlatma sırasını açıkça ayarlamak için Uygulama Başlatma özelliğini kullanabilir.
Uygulama Başlatması, başlatmanız gereken her bileşen için ayrı içerik sağlayıcılar tanımlamak yerine tek bir içerik sağlayıcıyı paylaşan bileşen başlatıcıları tanımlamanıza olanak tanır. Bu sayede uygulama başlatma süresi önemli ölçüde kısalabilir.
Kurulum
Jetpack Startup'ı kitaplığınızda veya uygulamanızda kullanmak için aşağıdakileri Gradle dosyanıza ekleyin:
Modern
dependencies { implementation "androidx.startup:startup-runtime:1.1.1" }
Kotlin
dependencies { implementation("androidx.startup:startup-runtime:1.1.1") }
Uygulama başlatılırken bileşenleri başlatma
Uygulamalar ve kitaplıklar genellikle bileşenlerin uygulama başlatılırken hemen başlatılmasını gerektirir. Her bağımlılığı başlatmak için içerik sağlayıcıları kullanarak bu ihtiyacı karşılayabilirsiniz ancak içerik sağlayıcılar örneklendirmek için pahalıdır ve başlangıç sırasını gereksiz şekilde yavaşlatabilir. Ayrıca Android, içerik sağlayıcıları belirli bir sırayla başlatır. Uygulama Başlatma, uygulama başlatılırken bileşenleri başlatmak ve bunların bağımlılıklarını açıkça tanımlamak için daha etkili bir yöntem sağlar.
Uygulama Başlatma'yı kullanarak bileşenleri başlangıçta otomatik olarak başlatmak isterseniz uygulamanın başlatması gereken her bileşen için bir bileşen başlatıcı tanımlamanız gerekir.
Bileşen başlatıcıları uygulama
Her bileşen başlatıcısını, Initializer<T>
arayüzünü uygulayan bir sınıf oluşturarak tanımlarsınız.
Bu arayüzde iki önemli yöntem tanımlanmaktadır:
- Bileşeni başlatmak için gerekli tüm işlemleri içeren ve
T
örneği döndürencreate()
yöntemi. - Başlatıcının bağımlı olduğu diğer
Initializer<T>
nesnelerinin bir listesini döndürendependencies()
yöntemi. Uygulamanın başlangıçta başlatıcıları çalıştırma sırasını kontrol etmek için bu yöntemi kullanabilirsiniz.
Örneğin, uygulamanızın WorkManager
'e bağlı olduğunu ve başlangıçta başlatması gerektiğini varsayalım. Initializer<WorkManager>
özelliğini uygulayan bir WorkManagerInitializer
sınıfı tanımlayın:
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
başka hiçbir kitaplığa bağımlı olmadığından dependencies()
yöntemi boş bir liste döndürür.
Uygulamanızın aynı zamanda ExampleLogger
adlı kitaplığa bağlı olduğunu da varsayalım. Bu kitaplığa da WorkManager
bağlıdır. Bu bağımlılık, Uygulama Başlatma'nın önce WorkManager
uygulamasını başlattığından emin olmanız gerektiği anlamına gelir. Initializer<ExampleLogger>
uygulayan bir ExampleLoggerInitializer
sınıfı tanımlayın:
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()
yöntemine WorkManagerInitializer
eklediğiniz için Uygulama Başlatma, ExampleLogger
tarihinden önce WorkManager
değerini başlatır.
Manifest girişlerini ayarlama
Uygulama Başlatma, bileşen başlatıcılarınızı keşfetmek ve çağırmak için kullanılan InitializationProvider
adlı özel bir içerik sağlayıcı içerir. Uygulama Başlatma, ilk olarak InitializationProvider
manifest girişi altında bir <meta-data>
girişi olup olmadığını kontrol ederek bileşen başlatıcılarını bulur. Ardından Uygulama Başlatma, önceden keşfettiği tüm başlatıcılar için dependencies()
yöntemlerini çağırır.
Bu, bir bileşen başlatıcının Uygulama Başlatma tarafından bulunabilir olması için aşağıdaki koşullardan birinin karşılanması gerektiği anlamına gelir:
- Bileşen başlatıcının
InitializationProvider
manifest girişi altında karşılık gelen bir<meta-data>
girişi vardır. - Bileşen başlatıcı,
dependencies()
yönteminde, halihazırda bulunabilir olan bir ilk başlatıcıdan listelenir.
WorkManagerInitializer
ve ExampleLoggerInitializer
örneğini tekrar ele alalım. Uygulama Başlatma'nın bu başlatıcıları keşfedebildiğinden emin olmak için aşağıdakileri manifest dosyasına ekleyin:
<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
, ExampleLoggerInitializer
ürününün bir bağımlılığı olduğundan WorkManagerInitializer
için <meta-data>
girişi eklemenize gerek yoktur.
Yani, ExampleLoggerInitializer
bulunabilir durumdaysa WorkManagerInitializer
de öyledir.
tools:node="merge"
özelliği, manifest birleştirme aracının çakışan girişleri düzgün şekilde çözmesini sağlar.
Hata analizi kontrolleri çalıştır
Uygulama Başlatma kitaplığı, bileşen başlatıcılarınızı doğru tanımlayıp tanımlamadığınızı kontrol etmek için kullanabileceğiniz bir dizi lint kuralı içerir. Bu lint kontrollerini, komut satırından ./gradlew :app:lintDebug
komutunu çalıştırarak gerçekleştirebilirsiniz.
Bileşenleri manuel olarak başlatma
Normal olarak Uygulama Başlatma'yı kullandığınızda InitializationProvider
nesnesi, uygulama başlatılırken bileşen başlatıcılarını otomatik olarak bulup çalıştırmak için AppInitializer
adlı bir varlık kullanır.
Ancak, uygulamanızın başlangıçta ihtiyacı olmayan bileşenleri manuel olarak başlatmak için doğrudan AppInitializer
kullanabilirsiniz. Buna geç başlatma adı verilir ve başlatma maliyetlerini en aza indirmeye yardımcı olabilir.
Önce manuel olarak başlatmak istediğiniz tüm bileşenler için otomatik başlatmayı devre dışı bırakmanız gerekir.
Tek bir bileşen için otomatik başlatmayı devre dışı bırak
Tek bir bileşende otomatik başlatmayı devre dışı bırakmak için söz konusu bileşenin başlatıcısına ait <meta-data>
girişini manifest'ten kaldırın.
Örneğin, manifest dosyasına aşağıdaki ifade eklendiğinde ExampleLogger
için otomatik başlatma devre dışı bırakılır:
<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>
Birleştirme aracının, girişi diğer tüm birleştirilmiş manifest dosyalarından da kaldırmasını sağlamak için, girişte yalnızca girişi kaldırmak yerine tools:node="remove"
kullanırsınız.
Tüm bileşenler için otomatik başlatmayı devre dışı bırak
Tüm otomatik başlatmayı devre dışı bırakmak için InitializationProvider
girişinin tamamını manifest dosyasından kaldırın:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
Bileşen başlatıcılarını manuel olarak çağır
Bir bileşen için otomatik başlatma devre dışıysa bu bileşeni ve bağımlılıklarını manuel olarak başlatmak için AppInitializer
kullanabilirsiniz.
Örneğin, aşağıdaki kod AppInitializer
yöntemini çağırır ve ExampleLogger
değerini manuel olarak başlatır:
Kotlin
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer::class.java)
Java
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer.class);
Bunun sonucunda WorkManager
, ExampleLogger
bağımlılığı olduğundan Uygulama Başlatma WorkManager
değerini de başlatır.
Geri bildirim gönderme
Aşağıdaki kaynakları kullanarak geri bildirimlerinizi ve fikirlerinizi bizimle paylaşabilirsiniz:
- Sorun izleyici
- Hataları düzeltebilmemiz için sorunları bildirin.
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken gösterilir
- Uygulama Mimarisi: Veri Katmanı - WorkManager ile Görev Planlama - Android Geliştiricileri
- Uygulama Mimarisi: Veri Katmanı - DataStore - Android Geliştiricileri