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

کتابخانه App Startup یک راه ساده و کارآمد برای مقداردهی اولیه اجزا در هنگام راه اندازی برنامه ارائه می دهد. هم توسعه‌دهندگان کتابخانه و هم توسعه‌دهندگان برنامه‌ها می‌توانند از App Startup برای ساده‌سازی دنباله‌های راه‌اندازی استفاده کنند و به صراحت ترتیب اولیه‌سازی را تنظیم کنند.

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

راه اندازی

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

شیار

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

کاتلین

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

هنگام راه اندازی برنامه، مؤلفه ها را راه اندازی کنید

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

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

پیاده سازی اولیه سازها

شما با ایجاد کلاسی که واسط 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 قبل از ExampleLogger ، WorkManager را مقداردهی اولیه می کند.

ورودی های مانیفست را تنظیم کنید

راه‌اندازی برنامه شامل یک ارائه‌دهنده محتوای ویژه به نام InitializationProvider است که از آن برای کشف و فراخوانی اولیه سازهای مؤلفه استفاده می‌کند. راه اندازی برنامه ابتدا با بررسی یک ورودی <meta-data> در زیر ورودی مانیفست InitializationProvider مقداردهی اولیه مؤلفه ها را کشف می کند. سپس، App Startup متدهای 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" تضمین می کند که ابزار ادغام manifest به درستی هر ورودی متناقضی را حل می کند.

بررسی های لینت را اجرا کنید

کتابخانه App Startup شامل مجموعه‌ای از قوانین پرز است که می‌توانید برای بررسی اینکه آیا اولیه‌کننده‌های مؤلفه خود را به درستی تعریف کرده‌اید یا خیر، استفاده کنید. با اجرای ./gradlew :app:lintDebug از خط فرمان می توانید این بررسی های پرز را انجام دهید.

کامپوننت ها را به صورت دستی مقداردهی کنید

معمولاً وقتی از App Startup استفاده می کنید، شی 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);

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

بازخورد ارائه دهید

نظرات و ایده های خود را از طریق این منابع با ما در میان بگذارید:

ردیاب مشکل
مشکلات را گزارش کنید تا بتوانیم اشکالات را برطرف کنیم.
{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}