راه‌اندازی برنامه   بخشی از Android Jetpack.

کتابخانه «راه‌اندازی برنامه» روشی ساده و کارآمد برای مقداردهی اولیه مؤلفه‌ها در زمان راه‌اندازی برنامه ارائه می‌دهد. هم توسعه‌دهندگان کتابخانه و هم توسعه‌دهندگان برنامه می‌توانند از «راه‌اندازی برنامه» برای ساده‌سازی توالی‌های راه‌اندازی و تنظیم صریح ترتیب مقداردهی اولیه استفاده کنند.

به‌جای تعریف ارائه‌دهندگان محتوای جداگانه برای هر مؤلفه‌ای که باید مقداردهی اولیه کنید، App Startup به شما امکان می‌دهد مقداردهی‌های اولیه مؤلفه را تعریف کنید که یک ارائه‌دهنده محتوای واحد را هم‌رسانی می‌کنند. این کار می‌تواند زمان راه‌اندازی برنامه را به‌طور قابل‌توجهی بهبود بخشد.

راه‌اندازی

برای استفاده از Jetpack Startup در کتابخانه یا برنامه، موارد زیر را به فایل Gradle خود اضافه کنید:

شیار

dependencies {
    implementation "androidx.startup:startup-runtime:1.2.0"
}

کاتلین

dependencies {
    implementation("androidx.startup:startup-runtime:1.2.0")
}

مقداردهی اولیه مؤلفه‌ها هنگام راه‌اندازی برنامه

برنامه‌ها و کتابخانه‌ها اغلب به این متکی هستند که مؤلفه‌ها بلافاصله پس‌از راه‌اندازی برنامه مقداردهی اولیه شوند. می‌توانید این نیاز را بااستفاده از ارائه‌دهندگان محتوا برای مقداردهی اولیه هر وابستگی برآورده کنید، اما ارائه‌دهندگان محتوا برای نمونه‌سازی گران هستند و می‌توانند توالی راه‌اندازی را بی‌دلیل کند کنند. علاوه‌براین، Android ارائه‌دهندگان محتوا را با ترتیبی نامشخص مقداردهی اولیه می‌کند. «راه‌اندازی برنامه» روشی با عملکرد بهتر برای مقداردهی اولیه مؤلفه‌ها در راه‌اندازی برنامه و تعریف صریح وابستگی‌های آن‌ها ارائه می‌دهد.

برای استفاده از «راه‌اندازی برنامه» جهت مقداردهی اولیه خودکار مؤلفه‌ها در زمان راه‌اندازی، باید مقداردهی اولیه مؤلفه را برای هر مؤلفه‌ای که برنامه نیاز به مقداردهی اولیه آن دارد تعریف کنید.

پیاده‌سازی مقداردهی‌های اولیه مؤلفه

هر مقداردهی اولیه مؤلفه را با ایجاد کلاسی که میانای Initializer<T> را پیاده‌سازی می‌کند تعریف می‌کنید. این میانای کاربری دو روش مهم را تعریف می‌کند:

  • روش create() که شامل همه عملیات لازم برای مقداردهی اولیه مؤلفه است و نمونه‌ای از T را برمی‌گرداند.
  • روش dependencies() که فهرستی از دیگر اشیاء Initializer<T> را که مقداردهی اولیه به آن‌ها وابسته است برمی‌گرداند. می‌توانید از این روش برای کنترل ترتیبی که برنامه مقداردهی‌های اولیه را در زمان راه‌اندازی اجرا می‌کند استفاده کنید.

برای مثال، فرض کنید که برنامه شما به WorkManager وابسته است و باید آن را در راه‌اندازی مقداردهی اولیه کند. کلاس WorkManagerInitializer را که Initializer<WorkManager> را پیاده‌سازی می‌کند تعریف کنید:

کاتلین

// 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()
    }
}

جاوا

// 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();
    }

}

روش dependencies() فهرست خالی برمی‌گرداند زیرا WorkManager به هیچ کتابخانه دیگری وابسته نیست.

فرض کنید برنامه‌تان به کتابخانه‌ای به‌نام ExampleLogger نیز وابسته است که آن هم به‌نوبه خود به WorkManager وابسته است. این وابستگی به این معنی است که باید مطمئن شوید که App Startup ابتدا WorkManager را مقداردهی اولیه می‌کند. کلاس ExampleLoggerInitializer را که Initializer<ExampleLogger> را پیاده‌سازی می‌کند تعریف کنید:

کاتلین

// 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)
    }
}

جاوا

// 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);
    }
}

چون WorkManagerInitializer را در روش dependencies() گنجانده‌اید، App Startup WorkManager را قبل‌از ExampleLogger مقداردهی اولیه می‌کند.

راه‌اندازی ورودی‌های مانیفست

«راه‌اندازی برنامه» شامل ارائه‌دهنده محتوای ویژه‌ای به‌نام InitializationProvider است که از آن برای کشف و فراخوانی مقداردهی‌های اولیه مؤلفه شما استفاده می‌کند. «راه‌اندازی برنامه» ابتدا با بررسی ورودی <meta-data> در ورودی مانیفست InitializationProvider، مقداردهی‌های اولیه مؤلفه را پیدا می‌کند. سپس، «راه‌اندازی برنامه» روش‌های dependencies() را برای هر مقداردهی اولیه‌ای که قبلاً کشف کرده است فراخوانی می‌کند.

این یعنی برای اینکه مقداردهی اولیه مؤلفه توسط App Startup قابل‌شناسایی باشد، یکی از شرایط زیر باید برآورده شود:

  • مقداردهی اولیه مؤلفه دارای ورودی <meta-data> متناظر در زیر ورودی مانیفست InitializationProvider است.
  • مقداردهی اولیه مؤلفه در روش dependencies() از یک مقداردهی اولیه که ازقبل قابل‌شناسایی است فهرست شده است.

دوباره مثال WorkManagerInitializer و ExampleLoggerInitializer را درنظر بگیرید. برای اطمینان از اینکه App Startup می‌تواند این مقداردهی‌های اولیه را پیدا کند، موارد زیر را به فایل مانیفست اضافه کنید:

<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>

لازم نیست ورودی <meta-data> را برای WorkManagerInitializer اضافه کنید، چون WorkManagerInitializer وابستگی ExampleLoggerInitializer است. این یعنی اگر ExampleLoggerInitializer یافتنی باشد، WorkManagerInitializer هم یافتنی است.

مشخصه tools:node="merge" تضمین می‌کند که ابزار ادغام مانیفست به‌درستی هرگونه ورودی متناقض را حل‌وفصل می‌کند.

اجرای بررسی‌های lint

کتابخانه «راه‌اندازی برنامه» شامل مجموعه‌ای از قوانین 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 را مقداردهی اولیه می‌کند:

کاتلین

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer::class.java)

جاوا

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer.class);

درنتیجه، «راه‌اندازی برنامه» WorkManager را نیز مقداردهی اولیه می‌کند زیرا WorkManager وابستگی ExampleLogger است.

ارائه کردن بازخورد

بازخورد و ایده‌هایتان را ازطریق این منابع با ما هم‌رسانی کنید:

ردیاب مشکل
مشکلات را گزارش کنید تا بتوانیم اشکالات را برطرف کنیم.