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ượng Initializer<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ê khai InitializationProvider.
  • 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 WorkManagerInitializerExampleLoggerInitializer Để đả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 WorkManagerWorkManager 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.