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üren create() yöntemi.
  • Başlatıcının bağımlı olduğu diğer Initializer<T> nesnelerinin bir listesini döndüren dependencies() 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.