สำรองข้อมูลผู้ใช้ด้วยการสำรองข้อมูลอัตโนมัติ

การสำรองข้อมูลอัตโนมัติสำหรับแอปจะสำรองข้อมูลของผู้ใช้จากแอปที่กำหนดเป้าหมายและทำงานใน Android 6.0 (API ระดับ 23) ขึ้นไปโดยอัตโนมัติ Android จะเก็บข้อมูลแอปไว้โดยอัปโหลดไปยัง Google ไดรฟ์ของผู้ใช้ ซึ่งข้อมูลดังกล่าวจะได้รับการปกป้องด้วยข้อมูลเข้าสู่ระบบบัญชี Google ของผู้ใช้ ข้อมูลสำรองได้รับการเข้ารหัสจากต้นทางถึงปลายทางในอุปกรณ์ที่ใช้ Android 9 ขึ้นไปโดยใช้ PIN, รูปแบบ หรือรหัสผ่านของอุปกรณ์ แอปทุกแอปสามารถจัดสรรพื้นที่เก็บข้อมูลสํารองได้สูงสุด 25 MB ต่อผู้ใช้แอป 1 คน โดยไม่มีค่าใช้จ่ายในการจัดเก็บข้อมูลสำรอง แอปสามารถปรับแต่งกระบวนการสำรองข้อมูลหรือเลือกไม่ใช้ได้โดยปิดใช้การสำรองข้อมูล

ดูภาพรวมของตัวเลือกการสำรองข้อมูลของ Android และคำแนะนำเกี่ยวกับข้อมูลที่จะสำรองและกู้คืนได้ที่ภาพรวมการสำรองข้อมูล

ไฟล์ที่สำรองข้อมูลไว้

โดยค่าเริ่มต้น การสำรองข้อมูลอัตโนมัติจะรวมไฟล์ในไดเรกทอรีส่วนใหญ่ที่ระบบกำหนดให้กับแอปของคุณ ดังนี้

  • ไฟล์ค่ากำหนดที่แชร์

  • ไฟล์ที่บันทึกไว้ในที่จัดเก็บข้อมูลภายในของแอปและเข้าถึงโดย getFilesDir() หรือ getDir(String, int)

  • ไฟล์ในไดเรกทอรีที่ getDatabasePath(String) แสดงผล ซึ่งรวมถึงไฟล์ที่สร้างด้วยคลาส SQLiteOpenHelper ด้วย

  • ไฟล์ในที่จัดเก็บข้อมูลภายนอกในไดเรกทอรีที่ getExternalFilesDir(String) แสดง

การสำรองข้อมูลอัตโนมัติจะไม่รวมไฟล์ในไดเรกทอรีที่แสดงผลโดย getCacheDir(), getCodeCacheDir() และ getNoBackupFilesDir() ไฟล์ที่บันทึกไว้ในตำแหน่งเหล่านี้จําเป็นเพียงชั่วคราวและตั้งใจที่จะยกเว้นจากการดำเนินการสำรองข้อมูล

คุณสามารถกำหนดค่าแอปให้รวมและยกเว้นไฟล์บางรายการได้ ดูข้อมูลเพิ่มเติมได้ที่ส่วนรวมและยกเว้นไฟล์

ตำแหน่งของข้อมูลสำรอง

ข้อมูลสำรองจะเก็บไว้ในโฟลเดอร์ส่วนตัวในบัญชี Google ไดรฟ์ของผู้ใช้ โดยจำกัดที่ 25 MB ต่อแอป ข้อมูลที่บันทึกไว้จะไม่นับรวมในโควต้า Google ไดรฟ์ส่วนตัวของผู้ใช้ ระบบจะจัดเก็บเฉพาะข้อมูลสำรองล่าสุดเท่านั้น เมื่อทำการสำรองข้อมูล ระบบจะลบข้อมูลสำรองก่อนหน้าออก ผู้ใช้หรือแอปอื่นๆ ในอุปกรณ์จะอ่านข้อมูลสำรองไม่ได้

ผู้ใช้จะเห็นรายการแอปที่สำรองข้อมูลไว้ในแอป Google ไดรฟ์บน Android โดยในอุปกรณ์ที่ทำงานด้วยระบบปฏิบัติการ Android ผู้ใช้จะเห็นรายการนี้ในลิ้นชักการนำทางของแอปไดรฟ์ในส่วนการตั้งค่า > การสํารองข้อมูลและการรีเซ็ต

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

  • หากผู้ใช้มีอุปกรณ์ 2 เครื่อง ก็จะมีชุดข้อมูลสํารองสําหรับอุปกรณ์แต่ละเครื่อง

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

กำหนดการสำรองข้อมูล

ระบบจะสำรองข้อมูลโดยอัตโนมัติเมื่อตรงกับเงื่อนไขทั้งหมดต่อไปนี้

  • ผู้ใช้เปิดใช้การสำรองข้อมูลในอุปกรณ์ ใน Android 9 การตั้งค่านี้อยู่ในการตั้งค่า > ระบบ > การสำรองข้อมูล
  • เมื่อเวลาผ่านไปอย่างน้อย 24 ชั่วโมงนับตั้งแต่การสำรองข้อมูลครั้งล่าสุด
  • อุปกรณ์ไม่มีการใช้งาน
  • อุปกรณ์เชื่อมต่อกับเครือข่าย Wi-Fi (หากผู้ใช้อุปกรณ์ไม่ได้เลือกใช้การสำรองข้อมูลผ่านอินเทอร์เน็ตมือถือ)

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

ในระหว่างการสำรองข้อมูลอัตโนมัติ ระบบจะปิดแอปเพื่อให้แน่ใจว่าแอปไม่ได้เขียนลงในระบบไฟล์อีกต่อไป โดยค่าเริ่มต้น ระบบการสำรองข้อมูลจะไม่สนใจแอปที่ทำงานอยู่เบื้องหน้าเพื่อไม่ให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี คุณสามารถลบล้างลักษณะการทำงานเริ่มต้นได้โดยตั้งค่าแอตทริบิวต์ android:backupInForeground เป็น "จริง"

Android มีเครื่องมือที่ช่วยให้คุณเริ่มสำรองข้อมูลแอปด้วยตนเองได้ เพื่อลดความซับซ้อนในการทดสอบ ดูข้อมูลเพิ่มเติมได้ที่ทดสอบการสำรองและกู้คืนข้อมูล

คืนค่ากำหนดเวลา

ระบบจะกู้คืนข้อมูลทุกครั้งที่มีการติดตั้งแอป ไม่ว่าจะเป็นจาก Play Store ระหว่างการตั้งค่าอุปกรณ์ (เมื่อระบบติดตั้งแอปที่ติดตั้งไว้ก่อนหน้านี้) หรือโดยเรียกใช้adb install การดำเนินการกู้คืนจะเกิดขึ้นหลังจากติดตั้ง APK แต่ก่อนที่ผู้ใช้จะเปิดแอปได้

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

Android มีเครื่องมือที่ช่วยให้คุณเริ่มการกู้คืนแอปด้วยตนเองได้ง่ายขึ้น ดูข้อมูลเพิ่มเติมได้ที่ทดสอบการสำรองและกู้คืนข้อมูล

เปิดและปิดใช้การสำรองข้อมูล

แอปที่กำหนดเป้าหมายเป็น Android 6.0 (API ระดับ 23) ขึ้นไปจะเข้าร่วมการสำรองข้อมูลอัตโนมัติโดยอัตโนมัติ ในไฟล์ Manifest ของแอป ให้ตั้งค่าบูลีน android:allowBackup เพื่อเปิดหรือปิดใช้การสำรองข้อมูล ค่าเริ่มต้นคือ true แต่เราขอแนะนำให้ตั้งค่าแอตทริบิวต์ในไฟล์ Manifest อย่างชัดเจน ดังที่แสดงในตัวอย่างต่อไปนี้

<manifest ... >
    ...
    <application android:allowBackup="true" ... >
        ...
    </application>
</manifest>

คุณปิดใช้การสำรองข้อมูลได้โดยตั้งค่า android:allowBackup เป็น false คุณอาจต้องทําเช่นนี้หากแอปสามารถสร้างสถานะใหม่ผ่านกลไกอื่นๆ หรือหากแอปจัดการข้อมูลที่ละเอียดอ่อน

รวมและยกเว้นไฟล์

โดยค่าเริ่มต้น ระบบจะสำรองข้อมูลแอปเกือบทั้งหมด ดูข้อมูลเพิ่มเติมได้ที่ส่วนไฟล์ที่สำรองข้อมูลไว้

ส่วนนี้จะแสดงวิธีกำหนดกฎ XML ที่กําหนดเองเพื่อควบคุมสิ่งที่จะสํารองข้อมูล หากแอปกำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไป คุณต้องระบุกฎการสำรองข้อมูล XML ชุดเพิ่มเติมตามที่อธิบายไว้ในส่วนนี้เพื่อรองรับการเปลี่ยนแปลงการกู้คืนข้อมูลสำรองที่เปิดตัวสำหรับอุปกรณ์ที่ใช้ Android เวอร์ชันเหล่านี้

ควบคุมการสำรองข้อมูลใน Android 11 และต่ำกว่า

ทำตามขั้นตอนในส่วนนี้เพื่อควบคุมไฟล์ที่จะสำรองข้อมูลในอุปกรณ์ที่ใช้ Android 11 (API ระดับ 30) หรือต่ำกว่า

  1. ในไฟล์ AndroidManifest.xml ให้เพิ่มแอตทริบิวต์ android:fullBackupContent ลงในองค์ประกอบ <application> ดังที่แสดงในตัวอย่างต่อไปนี้ แอตทริบิวต์นี้ชี้ไปยังไฟล์ XML ที่มีกฎการสำรองข้อมูล

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
    
  2. สร้างไฟล์ XML ชื่อ @xml/backup_rules ในไดเรกทอรี res/xml/ ในไฟล์นี้ ให้เพิ่มกฎด้วยองค์ประกอบ <include> และ <exclude> ตัวอย่างต่อไปนี้จะสำรองข้อมูลค่ากำหนดที่แชร์ทั้งหมดยกเว้น device.xml

    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
     <include domain="sharedpref" path="."/>
     <exclude domain="sharedpref" path="device.xml"/>
    </full-backup-content>
    

กำหนดเงื่อนไขของอุปกรณ์ที่จําเป็นสําหรับการสํารองข้อมูล

หากแอปบันทึกข้อมูลที่ละเอียดอ่อนไว้ในอุปกรณ์ คุณระบุเงื่อนไขที่ข้อมูลของแอปจะรวมอยู่ในการสำรองข้อมูลของผู้ใช้ได้ คุณสามารถใส่เงื่อนไขต่อไปนี้ใน Android 9 (API ระดับ 28) ขึ้นไป

หากอัปเกรดอุปกรณ์สำหรับพัฒนาเป็น Android 9 แล้ว คุณต้องปิดใช้แล้วเปิดการสำรองข้อมูลอีกครั้งหลังจากอัปเกรด เนื่องจาก Android จะเข้ารหัสข้อมูลสำรองด้วยข้อมูลลับฝั่งไคลเอ็นต์หลังจากที่แจ้งให้ผู้ใช้ทราบในการตั้งค่าหรือวิซาร์ดการตั้งค่าเท่านั้น

หากต้องการประกาศเงื่อนไขการรวม ให้ตั้งค่าแอตทริบิวต์ requireFlags เป็นค่าหรือค่าที่เลือกในองค์ประกอบ <include> ภายในชุดกฎการสำรองข้อมูล

backup_rules.xml

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <!-- App data isn't included in user's backup
         unless client-side encryption is enabled. -->
    <include domain="file" path="."
             requireFlags="clientSideEncryption" />
</full-backup-content>

หากแอปใช้ระบบข้อมูลสำรองคีย์-ค่า หรือหากคุณใช้งาน BackupAgent ด้วยตนเอง คุณยังนำข้อกำหนดแบบมีเงื่อนไขเหล่านี้ไปใช้กับตรรกะสำรองได้โดยทำการเปรียบเทียบเล็กน้อยระหว่างชุด Transport Flag ของออบเจ็กต์ BackupDataOutput กับ Flag FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED หรือ Flag FLAG_DEVICE_TO_DEVICE_TRANSFER ของ Agent ข้อมูลสำรองที่กำหนดเอง

ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างการใช้เมธอดนี้

Kotlin

class CustomBackupAgent : BackupAgent() {
    override fun onBackup(oldState: ParcelFileDescriptor?,
            data: BackupDataOutput?, newState: ParcelFileDescriptor?) {
        if (data != null) {
            if ((data.transportFlags and
                    FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) {
                // Client-side backup encryption is enabled.
            }

            if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) {
                // Local device-to-device transfer is enabled.
            }
        }
    }

    // Implementation of onRestore() here.
}

Java

public class CustomBackupAgent extends BackupAgent {
    @Override
    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
            ParcelFileDescriptor newState) throws IOException {
        if ((data.getTransportFlags() &
                FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) {
            // Client-side backup encryption is enabled.
        }

        if ((data.getTransportFlags() &
                FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) {
            // Local device-to-device transfer is enabled.
        }
    }

    // Implementation of onRestore() here.
}

ควบคุมการสำรองข้อมูลใน Android 12 ขึ้นไป

หากแอปกำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไป ให้ทำตามขั้นตอนในส่วนนี้เพื่อควบคุมไฟล์ที่จะสำรองในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป

  1. ในไฟล์ AndroidManifest.xml ให้เพิ่มแอตทริบิวต์ android:dataExtractionRules ลงในองค์ประกอบ <application> ดังที่แสดงในตัวอย่างต่อไปนี้ แอตทริบิวต์นี้จะชี้ไปยังไฟล์ XML ที่มีกฎการสำรองข้อมูล

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
    
  2. สร้างไฟล์ XML ชื่อ backup_rules.xml ในไดเรกทอรี res/xml/ ในไฟล์นี้ ให้เพิ่มกฎด้วยองค์ประกอบ <include> และ <exclude> ตัวอย่างต่อไปนี้จะสำรองข้อมูลค่ากำหนดที่แชร์ทั้งหมดยกเว้น device.xml

    <?xml version="1.0" encoding="utf-8"?>
    <data-extraction-rules>
     <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]>
       <include domain="sharedpref" path="."/>
       <exclude domain="sharedpref" path="device.xml"/>
     </cloud-backup>
    </data-extraction-rules>
    

ไวยากรณ์การกำหนดค่า XML

ไวยากรณ์ XML สำหรับไฟล์กำหนดค่าจะแตกต่างกันไปตามเวอร์ชัน Android ที่แอปกำหนดเป้าหมายและใช้งานอยู่

Android 11 หรือต่ำกว่า

ใช้ไวยากรณ์ XML ต่อไปนี้สำหรับไฟล์การกําหนดค่าที่ควบคุมการสำรองข้อมูลสำหรับอุปกรณ์ที่ใช้ Android 11 หรือต่ำกว่า

<full-backup-content>
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"
    requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] />
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string" />
</full-backup-content>

Android 12 ขึ้นไป

หากแอปกำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไป ให้ใช้ไวยากรณ์ XML ต่อไปนี้สำหรับไฟล์การกำหนดค่าที่ควบคุมการสำรองข้อมูลสำหรับอุปกรณ์ที่ใช้ Android 12 ขึ้นไป

<data-extraction-rules>
  <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]>
    ...
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
  </cloud-backup>
  <device-transfer>
    ...
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
  </device-transfer>
</data-extraction-rules>

แต่ละส่วนของการกำหนดค่า (<cloud-backup>, <device-transfer>) มีกฎที่ใช้กับการโอนประเภทดังกล่าวเท่านั้น การแยกนี้จะช่วยให้คุณยกเว้นไฟล์หรือไดเรกทอรีจากข้อมูลสำรองของ Google ไดรฟ์ในขณะที่ยังคงโอนไฟล์ระหว่างการโอนระหว่างอุปกรณ์ (D2D) ได้ เป็นต้น ซึ่งจะมีประโยชน์ในกรณีที่คุณมีไฟล์ขนาดใหญ่เกินกว่าที่จะสำรองข้อมูลไปยังระบบคลาวด์ได้ แต่สามารถโอนระหว่างอุปกรณ์ได้โดยไม่มีปัญหา

หากไม่มีกฎสำหรับโหมดการสำรองข้อมูลบางโหมด เช่น ไม่มีส่วน <device-transfer> โหมดดังกล่าวจะเปิดใช้อย่างสมบูรณ์สำหรับเนื้อหาทั้งหมดยกเว้นไดเรกทอรี no-backup และ cache ตามที่อธิบายไว้ในส่วนไฟล์ที่สำรองข้อมูลไว้

แอปสามารถตั้งค่า Flag disableIfNoEncryptionCapabilities ในส่วน <cloud-backup> เพื่อให้แน่ใจว่าระบบจะสำรองข้อมูลเฉพาะในกรณีที่สามารถเข้ารหัสได้ เช่น เมื่อผู้ใช้มีหน้าจอล็อก การตั้งข้อจำกัดนี้จะหยุดไม่ให้ระบบส่งข้อมูลสำรองไปยังระบบคลาวด์หากอุปกรณ์ของผู้ใช้ไม่รองรับการเข้ารหัส แต่เนื่องจากระบบจะไม่ส่งการโอน D2D ไปยังเซิร์ฟเวอร์ การโอนจึงจะยังคงทำงานต่อไปได้แม้ในอุปกรณ์ที่ไม่รองรับการเข้ารหัส

ไวยากรณ์สําหรับรวมและยกเว้นองค์ประกอบ

คุณกำหนดองค์ประกอบ <include> และ <exclude> ได้ในแท็ก <full-backup-content>, <cloud-backup> และ <device-transfer> (ขึ้นอยู่กับเวอร์ชัน Android ของอุปกรณ์และtargetSDKVersionของแอป) ดังนี้

<include>

ระบุไฟล์หรือโฟลเดอร์ที่จะสํารองข้อมูล โดยค่าเริ่มต้น การสำรองข้อมูลอัตโนมัติจะรวมไฟล์แอปเกือบทั้งหมด หากคุณระบุองค์ประกอบ <include> ระบบจะไม่รวมไฟล์ใดๆ ไว้โดยค่าเริ่มต้นอีกต่อไปและจะสำรองข้อมูลเฉพาะไฟล์ที่ระบุ หากต้องการรวมหลายไฟล์ ให้ใช้องค์ประกอบ <include> หลายรายการ

ใน Android 11 และต่ำกว่า องค์ประกอบนี้ยังมีแอตทริบิวต์ requireFlags ได้ด้วย ซึ่งส่วนที่อธิบายวิธีระบุข้อกำหนดเกี่ยวกับเงื่อนไขสำหรับการสำรองข้อมูลจะให้รายละเอียดเพิ่มเติม

ระบบจะยกเว้นไฟล์ในไดเรกทอรีที่ getCacheDir(), getCodeCacheDir() หรือ getNoBackupFilesDir() แสดงผลเสมอ แม้ว่าคุณจะพยายามรวมไฟล์เหล่านั้นไว้ก็ตาม

<exclude>

ระบุไฟล์หรือโฟลเดอร์ที่จะยกเว้นระหว่างการสำรองข้อมูล ต่อไปนี้คือไฟล์ที่โดยทั่วไปจะยกเว้นจากการสำรองข้อมูล

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

  • ไฟล์ที่เกี่ยวข้องกับการแก้ไขข้อบกพร่องของแอป

  • ไฟล์ขนาดใหญ่ที่ทำให้แอปใช้โควต้าการสำรองข้อมูลเกิน 25 MB

เอลิเมนต์ <include> และ <exclude> แต่ละรายการต้องมีแอตทริบิวต์ 2 รายการต่อไปนี้

domain

ระบุตำแหน่งของทรัพยากร ค่าที่ถูกต้องสำหรับแอตทริบิวต์นี้ได้แก่

  • root: ไดเรกทอรีในระบบไฟล์ที่จัดเก็บไฟล์ส่วนตัวทั้งหมดของแอปนี้
  • file: ไดเรกทอรีที่ getFilesDir() แสดง
  • database: ไดเรกทอรีที่ getDatabasePath() แสดง ระบบจะจัดเก็บฐานข้อมูลที่สร้างขึ้นด้วย SQLiteOpenHelper ไว้ที่นี่
  • sharedpref: ไดเรกทอรีที่จัดเก็บ SharedPreferences
  • external: ไดเรกทอรีที่ getExternalFilesDir() แสดง
  • device_root: เช่น root แต่สำหรับพื้นที่เก็บข้อมูลที่มีการป้องกันอุปกรณ์
  • device_file: เหมือนกับ file แต่สำหรับพื้นที่เก็บข้อมูลที่อุปกรณ์ปกป้อง
  • device_database: เช่น database แต่สำหรับพื้นที่เก็บข้อมูลที่มีการป้องกันอุปกรณ์
  • device_sharedpref: เหมือนกับ sharedpref แต่สำหรับพื้นที่เก็บข้อมูลที่อุปกรณ์ปกป้อง
path

ระบุไฟล์หรือโฟลเดอร์ที่จะรวมหรือยกเว้นจากการสํารองข้อมูล ข้อควรทราบ มีดังนี้

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

ใช้ BackupAgent

แอปที่ใช้การสำรองข้อมูลอัตโนมัติไม่จำเป็นต้องใช้ BackupAgent แต่คุณเลือกใช้ BackupAgent ที่กําหนดเองได้ โดยปกติแล้ว การทำเช่นนี้มีสาเหตุ 2 ประการ ได้แก่

  • คุณต้องการรับการแจ้งเตือนเกี่ยวกับเหตุการณ์การสำรองข้อมูล เช่น onRestoreFinished() และ onQuotaExceeded(long, long) ระบบจะเรียกใช้เมธอดการเรียกกลับเหล่านี้แม้ว่าแอปจะไม่ทํางานอยู่ก็ตาม

  • การแสดงชุดไฟล์ที่ต้องการสำรองข้อมูลด้วยกฎ XML เป็นเรื่องยาก ในกรณีที่เกิดขึ้นไม่บ่อยนักเหล่านี้ คุณสามารถใช้ BackupAgent ที่ลบล้าง onFullBackup(FullBackupDataOutput) เพื่อจัดเก็บข้อมูลที่ต้องการ หากต้องการเก็บไว้ใช้กับการใช้งานเริ่มต้นของระบบ ให้เรียกใช้เมธอดที่เกี่ยวข้องในซุปเปอร์คลาสด้วย super.onFullBackup()

หากคุณใช้ BackupAgent โดยค่าเริ่มต้น ระบบจะคาดหวังว่าแอปของคุณจะสํารองและกู้คืนคีย์-ค่า หากต้องการใช้การสำรองข้อมูลอัตโนมัติตามไฟล์แทน ให้ตั้งค่าแอตทริบิวต์ android:fullBackupOnly เป็น true ในไฟล์ Manifest ของแอป

ในระหว่างการดำเนินการสำรองและกู้คืนอัตโนมัติ ระบบจะเปิดแอปในโหมดที่จํากัดเพื่อทั้งป้องกันไม่ให้แอปเข้าถึงไฟล์ที่อาจทําให้เกิดข้อขัดแย้ง และเพื่อให้แอปเรียกใช้เมธอดการติดต่อกลับใน BackupAgent ในโหมดที่จํากัดนี้ ระบบจะไม่เปิดใช้งานกิจกรรมหลักของแอปโดยอัตโนมัติ ผู้ให้บริการเนื้อหาจะไม่ได้รับการเริ่มต้น และระบบจะสร้างอินสแตนซ์ของคลาสพื้นฐาน Application แทนการสร้างอินสแตนซ์ของคลาสย่อยที่ประกาศไว้ในไฟล์ Manifest ของแอป

BackupAgent ต้องใช้เมธอด Abstract onBackup() และ onRestore() ซึ่งใช้สำหรับการสำรองข้อมูลคีย์-ค่า หากไม่ต้องการสำรองข้อมูลคีย์-ค่า ให้ปล่อยการใช้งานเมธอดเหล่านั้นว่างไว้

ดูข้อมูลเพิ่มเติมได้ที่ Extend BackupAgent