จัดการ Startup Logic ให้อยู่หมัด ด้วย Jetpack App Startup
เป็นเรื่องปกติที่ Library บางอย่างต้องมีการ Initialize ค่าบางอย่าง พร้อมกับการตอนเปิดแอป ซึ่งบาง Libraries ก็ใช้วิธีให้เพิ่มการ Initialize ใน Application class หรือ Libraries อย่าง WorkManager, Firebase ก็ทำการ Initialize ผ่าน Content Provider ไว้ให้เสร็จสรรพแล้ว
ซึ่งการมีหลาย Content Provider ก็อาจจะทำให้ เมื่อ User เปิดแอปขึ้นมา แอปอาจจะทำงานช้าลงได้ ดังนั้นก็เลยเกิดมี Library ที่ชื่อ Jetpack App Startup ขึ้นมา
Jetpack App Startup คืออะไร?
Jetpack App Startup คือ Library ที่ช่วยให้จัดการ การ Initialize Component ต่าง ๆ ตอนที่แอปเริ่มทำงาน ให้มีประสิทธิภาพและตรงไปตรงมา ซึ่งสามารถใช้งาน เพื่อกำหนดลำลับการทำงานได้อย่างชัดเจน และ App Startup ยังช่วยลดการใช้งาน Content Provider เพื่อลดเวลาในการเปิดใช้งานแอปลง โดยใช้แค่ Content Provider เดียวเพื่อจัดการการ Initialize Component ทั้งหมด
เริ่มใช้งาน Jetpack App Startup
เพิ่ม Dependency ใน build.gradle
สร้าง Component Initializer
สร้าง Class ที่ implement interface Initializer
โดยมี method ที่สำคัญ 2 method คือ
create()
เป็น method ที่ไว้กำหนดการ Initialize ของ Library ที่เราต้องการdependencies()
เป็น method ที่เอาไว้กำหนดว่า Initializer นี้ต้องการ Dependency อะไรบ้าง ซึ่งจะเป็นตัวหนึ่งซึ่งกำหนดลำดับการทำงานของ Component ต่าง ๆ ว่าจะต้องรันอะไรขึ้นก่อนได้ เช่นถ้าหากAInitializer
ต้องการBInitailizer
และBInitialier
ก็ต้องการCInitializer
เป็น Dependency การทำงานก็จะเริ่มจากCInitializer
ตามด้วยBInitialier
แล้วค่อยเป็นAInitializer
เป็นอันดับสุดท้าย
ตัวอย่างเช่น เราต้องการสร้าง Initializer สำหรับWorkManager
เราก็ตั้งชื่อเป็น WorkManagerInitializer
โดย implement interface Initializer<WorkManager>
สังเกตได้ว่า method dependencies()
นั้น Return เป็น Empty List เพราะว่า WorkManager
ไม่ได้ต้องการ Library อื่นเป็น Dependency แต่อย่างใด
แต่ถ้าหากมี Library สักอย่างที่ต้องการ WorkManager
เป็น Dependecy แล้วละก็. เราก็สามารถประกาศ Class ได้ประมาณนี้
App Startup จะทำการ Initialize WorkManager
ก่อน ExampleLogger
เพราะมีการกำหนดให้ WorkManagerInitializer
เป็น Dependency ของ ExampleLoggerInitializer
กำหนดให้ Component Initializer ทำงานอัตโนมัติ
สำหรับ Component ที่เราต้องการให้เริ่มทำงานอัตโนมัติ สามารถเพิ่มใน <meta-data>
ใน AndroidManifest.xml
ได้
จะสังเกตได้ว่าเราไม่จำเป็นต้องใส่ WorkManagerInitializer
เพราะ WorkManagerInitializer
เป็น Dependency ของ ExampleLoggerInitializer
นั่นหมายความว่า มันจะ Initialize ให้อัตโนมัติหาก ExampleLoggerInitializer
ทำง
tools:node="merge"
เป็นแอตทริบิวต์ ที่ช่วยจัดการเวลามีการตั้งค่าที่ขัดแย้งกันเกิดขึ้น
กำหนดให้ Component Initializer เมื่อต้องการ
ในบางครั้ง อาจจะไม่ได้ต้องการใน Component นั้นรันตอนที่แอปเริ่มทำงาน แต่อาจจะต้องการเมื่อ User ต้องการจะทำงานบางอย่าง เราก็สามารถกำหนดให้ Component นั้น Initialize เมื่อต้องการก็ได้ โดยลบ <meta-data>
ของ Component นั้น ๆ ออกจาก AndroidMenifest.xml
หรือจะใช้ tools:node=”remove"
ในแทนการลบ <meta-data>
ออกก็ได้เช่น
และสามารถเรียกใช้งานได้ด้วยคำสั่ง
โดย App Startup จะสร้าง WorkManager
ให้ด้วยเพราะเป็น Dependency ของ ExampleLogger
นั่นเอง และการทำงานนี้จะทำงานแค่ครั้งเดียว ถ้าเรามีการเรียก AppInitializer.initializecomponent()
อีกครั้ง จะไม่มีการ Initialize Component ต่าง ๆ ให้อีก
สรุป
App Startup เป็น Library ที่ช่วยในการ Initialize Component ต่าง ๆ โดยใช้ Content Provider เดียวแทนที่จะใช้ Content Provider แยกกันหลาย ๆ ตัว ซึ่งช่วยลดเวลาในการเปิดแอปได้ สามารถกำหนดให้ทำงานได้อัตโนมัติ หรือว่า เรียกใช้งานเองเมื่อต้องการก็ได้