ย้ายข้อมูลการใช้งานหน้าจอแนะนําไปยัง Android 12 ขึ้นไป

หากคุณใช้หน้าจอเริ่มต้น (Splash Screen) ที่กำหนดเองใน Android 11 หรือเวอร์ชันก่อนหน้า ให้ย้ายข้อมูลแอปไปยัง SplashScreen API เพื่อช่วยให้มั่นใจว่าแอปจะแสดงอย่างถูกต้องใน Android 12 ขึ้นไป

ตั้งแต่ Android 12 เป็นต้นไป ระบบจะใช้หน้าจอเริ่มต้นค่าเริ่มต้นของระบบ Android ในการเริ่มแอปแบบ Cold Start และการเริ่มแอปแบบ Warm Start สำหรับแอปทั้งหมด โดยค่าเริ่มต้น หน้าจอเริ่มต้น (Splash Screen) ของระบบนี้จะสร้างขึ้นโดยใช้องค์ประกอบไอคอน Launcher ของแอปและ windowBackground ของธีม หากเป็นสีเดียว

หากไม่ย้ายข้อมูลแอป ประสบการณ์การเปิดแอปใน Android 12 ขึ้นไปอาจลดลงหรือมีผลลัพธ์ที่ไม่คาดคิด

  • หากหน้าจอเริ่มต้น (Splash Screen) ที่มีอยู่ของคุณใช้ธีมที่กำหนดเองซึ่งลบล้าง android:windowBackground ระบบจะแทนที่หน้าจอเริ่มต้น (Splash Screen) ที่กำหนดเองด้วยหน้าจอเริ่มต้น (Splash Screen) ของระบบ Android เริ่มต้นใน Android 12 ขึ้นไป ซึ่งอาจไม่ใช่ประสบการณ์การใช้งานที่แอปของคุณต้องการมอบให้ผู้ใช้

  • หากหน้าจอเริ่มต้น (Splash Screen) ที่มีอยู่ติดตั้งใช้งานโดยใช้ Activity โดยเฉพาะ การเปิดแอปในอุปกรณ์ที่ใช้ Android 12 ขึ้นไปจะทำให้หน้าจอเริ่มต้น (Splash Screen) ซ้ำกัน โดยหน้าจอเริ่มต้น (Splash Screen) ของระบบจะแสดงขึ้น ตามด้วยกิจกรรมหน้าจอเริ่มต้น (Splash Screen) ที่มีอยู่

คุณสามารถป้องกันประสบการณ์การใช้งานที่แย่ลงหรือไม่พึงประสงค์เหล่านี้ได้โดยทำตามกระบวนการย้ายข้อมูลที่อธิบายไว้ในเอกสารนี้ให้เสร็จสมบูรณ์ หลังจากย้ายข้อมูลแล้ว API จะปรับปรุงเวลาเริ่มต้นทำงาน ช่วยให้คุณควบคุมประสบการณ์การใช้งานหน้าจอเริ่มต้น (Splash Screen) ได้อย่างเต็มที่ และสร้างประสบการณ์การเปิดใช้งานที่สอดคล้องกันมากขึ้นกับแอปอื่นๆ บนแพลตฟอร์ม

ไลบรารีความเข้ากันได้ของ SplashScreen

คุณใช้ SplashScreen API ได้โดยตรง แต่เราขอแนะนำอย่างยิ่งให้ใช้ไลบรารีความเข้ากันได้ของ Androidx SplashScreen แทน ไลบรารีความเข้ากันได้ใช้ SplashScreen API, เปิดใช้ความเข้ากันได้แบบย้อนหลัง และสร้างรูปลักษณ์ที่สอดคล้องกันสำหรับการแสดงหน้าจอเริ่มต้น (Splash Screen) ใน Android ทุกเวอร์ชัน เอกสารนี้เขียนขึ้นโดยใช้ไลบรารี compat

หากคุณย้ายข้อมูลโดยใช้ SplashScreen API โดยตรง หน้าจอเริ่มต้น (Splash Screen) ใน Android 11 และเวอร์ชันก่อนหน้าจะเหมือนกับก่อนการย้ายข้อมูลทุกประการ ตั้งแต่ Android 12 เป็นต้นไป หน้าจอเริ่มต้น (Splash Screen) จะมีรูปลักษณ์และความรู้สึกแบบ Android 12

หากคุณย้ายข้อมูลโดยใช้ไลบรารีความเข้ากันได้ SplashScreen ระบบจะแสดงหน้าจอเริ่มต้น (Splash Screen) เดียวกันใน Android ทุกเวอร์ชัน

ย้ายข้อมูลการติดตั้งใช้งานหน้าจอเริ่มต้น (Splash Screen)

ทำตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูลการติดตั้งใช้งานหน้าจอเริ่มต้น (Splash Screen) ที่มีอยู่ไปยัง Android 12 ขึ้นไป

ขั้นตอนนี้ใช้กับการติดตั้งใช้งานทุกประเภทที่คุณย้ายข้อมูลมา หากคุณย้ายข้อมูลจาก Activity โดยเฉพาะ ให้ทำตามแนวทางปฏิบัติแนะนำที่อธิบายไว้ในเอกสารนี้เพื่อปรับหน้าจอเริ่มต้น (Splash Screen) Activity ที่กำหนดเอง นอกจากนี้ SplashScreen API ยังช่วยลดเวลาในการตอบสนองของการเริ่มต้นที่เกิดจากกิจกรรมหน้าจอเริ่มต้น (Splash Screen) โดยเฉพาะด้วย

หากต้องการย้ายข้อมูลหน้าจอเริ่มต้น (Splash Screen) ให้ทำดังนี้

  1. ในไฟล์ build.gradle ให้เปลี่ยน compileSdkVersion และรวมไลบรารีความเข้ากันได้ SplashScreen ไว้ในทรัพยากร Dependency

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. สร้างธีมที่มีระดับบนสุดเป็น Theme.SplashScreen ตั้งค่าของ postSplashScreenTheme เป็นธีมที่ Activity ต้องใช้ และตั้งค่าของ windowSplashScreenAnimatedIcon เป็น Drawable หรือ Animated Drawable ส่วนแอตทริบิวต์อื่นๆ จะเป็นแอตทริบิวต์ที่ไม่บังคับ

    <style name="Theme.App.Starting" parent="Theme.SplashScreen">
       <!-- Set the splash screen background, animated icon, and animation
       duration. -->
       <item name="windowSplashScreenBackground">@color/...</item>
    
       <!-- Use windowSplashScreenAnimatedIcon to add a drawable or an animated
            drawable. One of these is required. -->
       <item name="windowSplashScreenAnimatedIcon">@drawable/...</item>
       <!-- Required for animated icons. -->
       <item name="windowSplashScreenAnimationDuration">200</item>
    
       <!-- Set the theme of the Activity that directly follows your splash
       screen. This is required. -->
       <item name="postSplashScreenTheme">@style/Theme.App</item>
    </style>
    

    หากต้องการเพิ่มสีพื้นหลังใต้ไอคอน คุณสามารถใช้ธีม Theme.SplashScreen.IconBackground และตั้งค่าแอตทริบิวต์ windowSplashScreenIconBackground ได้

  3. ในไฟล์ Manifest ให้แทนที่ธีมของกิจกรรมเริ่มต้นด้วยธีมที่คุณสร้างในขั้นตอนก่อนหน้า

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. เรียกใช้ installSplashScreen ในกิจกรรมเริ่มต้นก่อนเรียกใช้ super.onCreate()

    Kotlin

    class MainActivity : Activity() {
    
       override fun onCreate(savedInstanceState: Bundle?) {
           // Handle the splash screen transition.
           val splashScreen = installSplashScreen()
    
           super.onCreate(savedInstanceState)
           setContentView(R.layout.main_activity)
    ...

    Java

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
             // Handle the splash screen transition.
             SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
    
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main_activity);
        }
    }

installSplashScreen จะแสดงผลออบเจ็กต์หน้าจอเริ่มต้น (Splash Screen) ซึ่งคุณสามารถเลือกใช้เพื่อปรับแต่งภาพเคลื่อนไหวหรือแสดงหน้าจอเริ่มต้น (Splash Screen) บนหน้าจอเป็นเวลานานขึ้นได้ ดูรายละเอียดเพิ่มเติมเกี่ยวกับการปรับแต่งภาพเคลื่อนไหวได้ที่หัวข้อแสดงหน้าจอเริ่มต้น (Splash Screen) บนหน้าจอเป็นเวลานานขึ้นและปรับแต่งภาพเคลื่อนไหวสำหรับการปิดหน้าจอเริ่มต้น (Splash Screen)

ปรับกิจกรรมหน้าจอเริ่มต้น (Splash Screen) ที่กำหนดเองให้เข้ากับหน้าจอเริ่มต้น (Splash Screen)

หลังจากย้ายข้อมูลไปยังหน้าจอเริ่มต้น (Splash Screen) สำหรับ Android 12 ขึ้นไปแล้ว ให้ตัดสินใจว่าจะทำอย่างไรกับหน้าจอเริ่มต้น (Splash Screen) ที่กำหนดเองก่อนหน้านี้ Activity คุณมีตัวเลือกดังต่อไปนี้

  • เก็บกิจกรรมที่กำหนดเองไว้ แต่ป้องกันไม่ให้แสดง
  • เก็บกิจกรรมที่กำหนดเองไว้เพื่อเหตุผลด้านการสร้างแบรนด์
  • นำกิจกรรมที่กำหนดเองออกและปรับแอปตามความจำเป็น

ป้องกันไม่ให้แสดงกิจกรรมที่กำหนดเอง

หากหน้าจอเริ่มต้น (Splash Screen) Activity ก่อนหน้านี้ใช้สำหรับการกำหนดเส้นทางเป็นหลัก ให้พิจารณาวิธีนำออก เช่น คุณอาจลิงก์ไปยังกิจกรรมจริงโดยตรงหรือย้ายไปยังกิจกรรมเดียวที่มีองค์ประกอบย่อย หากทำไม่ได้ คุณสามารถใช้ SplashScreen.setKeepOnScreenCondition เพื่อคงกิจกรรมการกำหนดเส้นทางไว้แต่หยุดไม่ให้แสดงผล การดำเนินการนี้จะโอนหน้าจอเริ่มต้นไปยังกิจกรรมถัดไปและรองรับการเปลี่ยนผ่านที่ราบรื่น

Kotlin

  class RoutingActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        val splashScreen = installSplashScreen()
        super.onCreate(savedInstanceState)

        // Keep the splash screen visible for this Activity.
        splashScreen.setKeepOnScreenCondition { true }
        startSomeNextActivity()
        finish()
     }
   ...
  

Java

  public class RoutingActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      SplashScreen splashScreen = SplashScreen.installSplashScreen(this);

       super.onCreate(savedInstanceState);

       // Keep the splash screen visible for this Activity.
       splashScreen.setKeepOnScreenCondition(() -> true );
       startSomeNextActivity();
       finish();
    }
  ...
  

เก็บกิจกรรมที่กำหนดเองไว้สำหรับการสร้างแบรนด์

หากต้องการใช้หน้าจอเริ่มต้น (Splash Screen) Activity ก่อนหน้าเพื่อเหตุผลด้านการสร้างแบรนด์ คุณสามารถเปลี่ยนจากหน้าจอเริ่มต้น (Splash Screen) ของระบบเป็นหน้าจอเริ่มต้น (Splash Screen) Activity ที่กำหนดเองได้โดยปรับแต่งภาพเคลื่อนไหวสำหรับการปิดหน้าจอเริ่มต้น (Splash Screen) อย่างไรก็ตาม เราขอแนะนำให้หลีกเลี่ยงสถานการณ์นี้หากเป็นไปได้ และใช้ SplashScreen API เพื่อสร้างแบรนด์หน้าจอเริ่มต้น (Splash Screen)

หากต้องการแสดงกล่องโต้ตอบ เราขอแนะนำให้แสดงเหนือกิจกรรมหน้าจอเริ่มต้น (Splash Screen) ที่กำหนดเองที่ตามมา หรือเหนือกิจกรรมหลักหลังจากหน้าจอเริ่มต้น (Splash Screen) ของระบบ

นำกิจกรรมหน้าจอเริ่มต้น (Splash Screen) ที่กำหนดเองออก

โดยทั่วไป เราขอแนะนำให้นำหน้าจอเริ่มต้น (Splash Screen) ที่กำหนดเองก่อนหน้านี้ออกActivity ทั้งหมดเพื่อหลีกเลี่ยงการมีหน้าจอเริ่มต้น (Splash Screen) ซ้ำกัน เพื่อเพิ่มประสิทธิภาพ และเพื่อลดเวลาในการโหลดหน้าจอเริ่มต้น (Splash Screen) คุณสามารถใช้เทคนิคต่างๆ เพื่อหลีกเลี่ยงการแสดงกิจกรรมหน้าจอเริ่มต้น (Splash Screen) ที่ซ้ำซ้อนได้

  • ใช้การโหลดแบบ Lazy Loading สำหรับคอมโพเนนต์ โมดูล หรือไลบรารี หลีกเลี่ยงการโหลดหรือเริ่มต้นคอมโพเนนต์หรือไลบรารีที่ไม่จำเป็นต่อการทำงานของแอปเมื่อเปิดตัว โหลดในภายหลังเมื่อแอปต้องการ

    หากแอปจำเป็นต้องใช้คอมโพเนนต์เพื่อให้ทำงานได้อย่างถูกต้อง ให้โหลดคอมโพเนนต์เฉพาะเมื่อจำเป็นจริงๆ และไม่ใช่ตอนเปิดแอป หรือใช้ชุดข้อความเบื้องหลังเพื่อโหลดหลังจากแอปเริ่มทำงาน พยายามทำให้Application.onCreate()มีน้ำหนักเบาที่สุดเท่าที่จะเป็นไปได้

    นอกจากนี้ คุณยังใช้ประโยชน์จากไลบรารี App Startup เพื่อเริ่มต้นคอมโพเนนต์เมื่อเริ่มต้นแอปพลิเคชันได้ด้วย เมื่อดำเนินการดังกล่าว โปรดตรวจสอบว่ายังคงโหลดโมดูลที่จำเป็นทั้งหมดสำหรับกิจกรรมเริ่มต้น และไม่ทำให้เกิดความล่าช้าเมื่อโมดูลที่โหลดแบบ Lazy Loading พร้อมใช้งาน

  • สร้างตัวยึดตำแหน่งขณะโหลดข้อมูลจำนวนเล็กน้อยในเครื่อง ใช้วิธีการกำหนดธีมที่แนะนำและระงับการแสดงผลจนกว่าแอปจะพร้อม หากต้องการใช้หน้าจอเริ่มต้น (Splash Screen) ที่เข้ากันได้แบบย้อนหลัง ให้ทำตามขั้นตอนที่ระบุไว้ในแสดงหน้าจอเริ่มต้น (Splash Screen) บนหน้าจอเป็นระยะเวลานานขึ้น

  • แสดงตัวยึดตำแหน่ง สำหรับการโหลดผ่านเครือข่ายที่มีระยะเวลาไม่แน่นอน ให้ปิดหน้าจอเริ่มต้น (Splash Screen) และแสดงตัวยึดตำแหน่งสำหรับการโหลดแบบอะซิงโครนัส ลองใช้ภาพเคลื่อนไหวที่ละเอียดอ่อนกับพื้นที่เนื้อหาที่แสดงสถานะการโหลด ตรวจสอบว่าโครงสร้างเนื้อหาที่โหลดตรงกับโครงสร้างโครงร่างให้มากที่สุดเพื่อรองรับการเปลี่ยนผ่านที่ราบรื่นเมื่อโหลดเนื้อหา

  • ใช้การแคช เมื่อผู้ใช้เปิดแอปเป็นครั้งแรก คุณสามารถแสดงสัญญาณบอกสถานะการโหลดสำหรับองค์ประกอบ UI บางอย่างได้ ดังที่แสดงในรูปภาพต่อไปนี้ ครั้งถัดไปที่ผู้ใช้กลับมาที่แอป คุณสามารถแสดงเนื้อหาที่แคชไว้นี้ขณะโหลดเนื้อหาล่าสุดได้

รูปที่ 1 กำลังแสดงตัวยึดตำแหน่ง UI