راه اندازی برنامه بخشی از Android Jetpack .
کتابخانه App Startup یک راه ساده و کارآمد برای مقداردهی اولیه اجزا در هنگام راه اندازی برنامه ارائه می دهد. هم توسعهدهندگان کتابخانه و هم توسعهدهندگان برنامهها میتوانند از App Startup برای سادهسازی دنبالههای راهاندازی استفاده کنند و به صراحت ترتیب اولیهسازی را تنظیم کنند.
به جای تعریف ارائه دهندگان محتوای جداگانه برای هر مؤلفه ای که باید مقداردهی اولیه کنید، App Startup به شما اجازه می دهد تا مقداردهی اولیه کننده مؤلفه را تعریف کنید که یک ارائه دهنده محتوای واحد را به اشتراک بگذارد. این می تواند زمان راه اندازی اپلیکیشن را به میزان قابل توجهی بهبود بخشد.
راه اندازی
برای استفاده از Jetpack Startup در کتابخانه یا برنامه خود، موارد زیر را به فایل Gradle خود اضافه کنید:
شیار
dependencies { implementation "androidx.startup:startup-runtime:1.2.0" }
کاتلین
dependencies { implementation("androidx.startup:startup-runtime:1.2.0") }
هنگام راه اندازی برنامه، مؤلفه ها را راه اندازی کنید
برنامهها و کتابخانهها اغلب بر این تکیه میکنند که هنگام راهاندازی برنامه، مؤلفهها بلافاصله راهاندازی شوند. شما می توانید این نیاز را با استفاده از ارائه دهندگان محتوا برای مقداردهی اولیه هر وابستگی برآورده کنید، اما ارائه دهندگان محتوا برای نمونه سازی گران هستند و می توانند توالی راه اندازی را بی جهت کاهش دهند. علاوه بر این، اندروید ارائه دهندگان محتوا را به ترتیب نامشخصی مقداردهی اولیه می کند. راهاندازی برنامه راه کارآمدتری برای مقداردهی اولیه مولفهها در راهاندازی برنامه و تعریف صریح وابستگیهای آنها ارائه میکند.
برای استفاده از 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
است.
بازخورد ارائه دهید
نظرات و ایده های خود را از طریق این منابع با ما در میان بگذارید:
- ردیاب مشکل
- مشکلات را گزارش کنید تا بتوانیم اشکالات را برطرف کنیم.
برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- معماری برنامه: لایه داده - زمانبندی کار با WorkManager - توسعه دهندگان اندروید
- معماری برنامه: لایه داده - DataStore - توسعه دهندگان اندروید