Khởi động ứng dụng Một phần của Android Jetpack.
Thư viện Khởi động ứng dụng cung cấp một cách đơn giản và hiệu quả để khởi chạy khi khởi động ứng dụng. Cả nhà phát triển thư viện lẫn nhà phát triển ứng dụng có thể sử dụng tính năng Khởi động ứng dụng để tinh giản trình tự khởi động và đặt thứ tự rõ ràng khởi tạo.
Thay vì xác định các trình cung cấp nội dung riêng biệt cho từng thành phần, bạn cần Khởi động ứng dụng, tính năng Khởi động ứng dụng cho phép bạn xác định các trình khởi chạy thành phần có chung nhà cung cấp nội dung duy nhất. Giải pháp này có thể giúp cải thiện đáng kể thời gian khởi động ứng dụng.
Thiết lập
Để dùng tính năng Khởi động Jetpack trong thư viện hoặc ứng dụng, hãy thêm đoạn mã sau vào Gradle của bạn tệp:
Groovy
dependencies { implementation "androidx.startup:startup-runtime:1.1.1" }
Kotlin
dependencies { implementation("androidx.startup:startup-runtime:1.1.1") }
Khởi chạy các thành phần khi khởi động ứng dụng
Ứng dụng và thư viện thường dựa vào việc khởi chạy các thành phần ngay khi ứng dụng sẽ khởi động. Bạn có thể đáp ứng nhu cầu này bằng cách sử dụng nhà cung cấp nội dung để khởi tạo từng phần phụ thuộc, nhưng việc tạo bản sao của trình cung cấp nội dung rất tốn kém và có thể làm chậm trình tự khởi động một cách không cần thiết. Ngoài ra, Android khởi tạo các trình cung cấp nội dung theo một thứ tự chưa được xác định. Khởi động ứng dụng cung cấp hiệu quả hơn để khởi chạy các thành phần khi khởi động ứng dụng và một cách rõ ràng xác định các phần phụ thuộc.
Để sử dụng tính năng Khởi động ứng dụng nhằm tự động khởi chạy các thành phần khi khởi động, bạn phải xác định trình khởi chạy thành phần cho từng thành phần mà ứng dụng cần khởi tạo.
Triển khai trình khởi chạy thành phần
Bạn xác định từng trình khởi tạo thành phần bằng cách tạo một lớp triển khai
Giao diện Initializer<T>
.
Giao diện này xác định hai phương thức quan trọng:
- Phương thức
create()
chứa tất cả các thao tác cần thiết để khởi tạo thành phần và trả về một thực thểT
. - Phương thức
dependencies()
trả về danh sách các phương thức khác Các đối tượngInitializer<T>
mà trình khởi tạo phụ thuộc vào. Bạn có thể dùng để kiểm soát thứ tự ứng dụng chạy trình khởi chạy khi khởi động.
Ví dụ: Giả sử ứng dụng của bạn phụ thuộc vào
WorkManager
và cần
khởi chạy mã đó khi khởi động. Xác định một lớp WorkManagerInitializer
triển khai Initializer<WorkManager>
:
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(); } }
Phương thức dependencies()
trả về danh sách trống vì WorkManager
không
phụ thuộc vào bất kỳ thư viện nào khác.
Giả sử rằng ứng dụng của bạn cũng phụ thuộc vào một thư viện có tên là ExampleLogger
, trong
bật phụ thuộc vào WorkManager
. Phần phụ thuộc này có nghĩa là bạn cần đảm bảo
rằng tính năng Khởi động ứng dụng sẽ khởi chạy WorkManager
trước. Định nghĩa
Lớp ExampleLoggerInitializer
triển khai Initializer<ExampleLogger>
:
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); } }
Do bạn đưa WorkManagerInitializer
vào phương thức dependencies()
, nên Ứng dụng
Quá trình khởi động sẽ khởi chạy WorkManager
trước ExampleLogger
.
Thiết lập các mục nhập tệp kê khai
Công cụ Khởi động ứng dụng bao gồm một nhà cung cấp nội dung đặc biệt có tên là InitializationProvider
mà phương thức này dùng để khám phá và gọi trình khởi tạo thành phần. Khởi động ứng dụng
khám phá các trình khởi chạy thành phần bằng cách kiểm tra mục nhập <meta-data>
trước tiên
trong mục kê khai InitializationProvider
. Sau đó, tính năng Khởi động ứng dụng sẽ gọi hàm
Phương thức dependencies()
cho mọi trình khởi tạo mà hàm này đã phát hiện.
Điều này có nghĩa là để Ứng dụng có thể phát hiện trình khởi chạy thành phần Khi khởi động, bạn phải đáp ứng một trong các điều kiện sau:
- Trình khởi tạo thành phần có mục nhập
<meta-data>
tương ứng trong Mục kê khaiInitializationProvider
. - Trình khởi tạo thành phần được liệt kê trong phương thức
dependencies()
từ một trình khởi tạo nào đã có thể phát hiện được.
Hãy xem lại ví dụ với WorkManagerInitializer
và
ExampleLoggerInitializer
Để đảm bảo công cụ Khởi động ứng dụng có thể khám phá những
trình khởi tạo, hãy thêm đoạn mã sau vào tệp kê khai:
<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>
Bạn không cần thêm mục nhập <meta-data>
cho WorkManagerInitializer
,
vì WorkManagerInitializer
là phần phụ thuộc của ExampleLoggerInitializer
.
Điều này có nghĩa là nếu có thể tìm thấy ExampleLoggerInitializer
, thì
WorkManagerInitializer
Thuộc tính tools:node="merge"
đảm bảo rằng công cụ hợp nhất tệp kê khai
công cụ giải quyết đúng cách mọi mục nhập xung đột.
Chạy quá trình kiểm tra tìm lỗi mã nguồn
Thư viện Khởi động ứng dụng bao gồm một bộ quy tắc tìm lỗi mã nguồn mà bạn có thể dùng để kiểm tra
cho dù bạn đã xác định chính xác trình khởi chạy thành phần hay chưa. Bạn có thể thực hiện
các bước kiểm tra tìm lỗi mã nguồn này bằng cách chạy ./gradlew :app:lintDebug
từ dòng lệnh.
Khởi chạy thành phần theo cách thủ công
Thông thường, khi bạn sử dụng tính năng Khởi động ứng dụng, đối tượng InitializationProvider
sẽ sử dụng
thực thể được gọi
AppInitializer
đến
tự động khám phá và chạy trình khởi chạy thành phần khi khởi động ứng dụng.
Tuy nhiên, bạn cũng có thể sử dụng AppInitializer
trực tiếp để
khởi chạy các thành phần mà ứng dụng của bạn không cần khi khởi động. Hành động này được gọi là
khởi động từng phần để giảm thiểu chi phí khởi động.
Trước tiên, bạn phải tắt tính năng khởi chạy tự động cho mọi thành phần mình muốn để khởi tạo theo cách thủ công.
Tắt tính năng tự động khởi chạy cho một thành phần riêng lẻ
Để tắt tính năng khởi chạy tự động cho một thành phần, hãy xoá phương thức
Mục nhập <meta-data>
cho trình khởi chạy của thành phần đó từ tệp kê khai.
Ví dụ: việc thêm đoạn mã sau vào tệp kê khai sẽ tắt tính năng tự động
khởi chạy cho 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>
Bạn sử dụng tools:node="remove"
trong mục nhập thay vì chỉ xoá mục đó
để đảm bảo rằng công cụ sáp nhập cũng xoá mục nhập đó khỏi tất cả
tệp kê khai sáp nhập.
Tắt tính năng tự động khởi chạy cho tất cả thành phần
Để tắt tất cả hoạt động khởi chạy tự động, hãy xoá toàn bộ mục nhập cho
InitializationProvider
trong tệp kê khai:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
Gọi trình khởi chạy thành phần theo cách thủ công
Nếu tính năng tự động khởi chạy bị tắt cho một thành phần, bạn có thể sử dụng
AppInitializer
để khởi chạy thành phần đó và các phần phụ thuộc của thành phần đó theo cách thủ công.
Ví dụ: đoạn mã sau đây gọi AppInitializer
và khởi chạy theo cách thủ công
ExampleLogger
:
Kotlin
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer::class.java)
Java
AppInitializer.getInstance(context) .initializeComponent(ExampleLoggerInitializer.class);
Do đó, tính năng Khởi động ứng dụng cũng khởi chạy WorkManager
vì WorkManager
là
phần phụ thuộc của ExampleLogger
.
Gửi ý kiến phản hồi
Hãy chia sẻ phản hồi và ý kiến của bạn với chúng tôi thông qua các tài nguyên sau:
- Công cụ theo dõi lỗi
- Báo cáo sự cố để chúng tôi có thể sửa lỗi.
Đề xuất cho bạn
- Lưu ý: văn bản có đường liên kết sẽ hiện khi JavaScript tắt
- Cấu trúc ứng dụng: Lớp dữ liệu – Lên lịch tác vụ bằng WorkManager – Nhà phát triển Android
- Cấu trúc ứng dụng: Lớp dữ liệu – DataStore – Nhà phát triển Android