<provider>

ไวยากรณ์:
<provider android:authorities="list"
          android:directBootAware=["true" | "false"]
          android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:grantUriPermissions=["true" | "false"]
          android:icon="drawable resource"
          android:initOrder="integer"
          android:intentMatchingFlags=["none" | "enforceIntentFilter" | "allowNullAction"]
          android:label="string resource"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:permission="string"
          android:process="string"
          android:readPermission="string"
          android:syncable=["true" | "false"]
          android:writePermission="string" >
    ...
</provider>
มีอยู่ใน:
<application>
สามารถมี:
<meta-data>
<grant-uri-permission>
<intent-filter>
<path-permission>
<property>
คำอธิบาย:
ประกาศคอมโพเนนต์ผู้ให้บริการเนื้อหา ผู้ให้บริการเนื้อหาเป็นคลาสย่อยของ ContentProvider ที่ให้การเข้าถึงข้อมูลที่มีโครงสร้างซึ่ง แอปพลิเคชันจัดการ ผู้ให้บริการเนื้อหาทั้งหมดในแอปพลิเคชันต้องกำหนดไว้ใน <provider> ในไฟล์ Manifest มิฉะนั้นระบบจะไม่รู้จักผู้ให้บริการเนื้อหาและจะไม่เรียกใช้

ประกาศเฉพาะผู้ให้บริการเนื้อหาที่เป็นส่วนหนึ่งของแอปพลิเคชัน อย่าประกาศผู้ให้บริการเนื้อหาใน แอปพลิเคชันอื่นๆ ที่คุณใช้ในแอปพลิเคชันของคุณ

ระบบ Android จะจัดเก็บข้อมูลอ้างอิงถึงผู้ให้บริการเนื้อหาตามสตริง Authority ซึ่งเป็นส่วนหนึ่งของ Content URI ของผู้ให้บริการ ตัวอย่างเช่น สมมติว่าคุณต้องการเข้าถึงผู้ให้บริการเนื้อหาที่จัดเก็บข้อมูลเกี่ยวกับผู้เชี่ยวชาญด้านการดูแลสุขภาพ หากต้องการทำ เช่นนี้ ให้เรียกใช้เมธอด ContentResolver.query() ซึ่งใช้ URI ที่ระบุผู้ให้บริการในอาร์กิวเมนต์อื่นๆ ดังนี้

content://com.example.project.healthcareprovider/nurses/rn

content: _สคีม_ ระบุ URI เป็น Content URI ที่ชี้ไปยัง ผู้ให้บริการเนื้อหาของ Android Authority com.example.project.healthcareprovider ระบุตัวผู้ให้บริการเอง ระบบ Android จะค้นหา Authority ในรายการผู้ให้บริการที่รู้จักและ Authority ของผู้ให้บริการเหล่านั้น สตริงย่อย nurses/rn คือ เส้นทาง ซึ่งผู้ให้บริการเนื้อหาใช้ เพื่อระบุชุดย่อยของข้อมูลผู้ให้บริการ

เมื่อกำหนดผู้ให้บริการในองค์ประกอบ <provider> คุณ จะไม่ใส่สคีมหรือเส้นทางในอาร์กิวเมนต์ android:name แต่จะใส่เฉพาะ Authority

ดูข้อมูลเกี่ยวกับการใช้และการพัฒนาผู้ให้บริการเนื้อหาได้ที่ ผู้ให้บริการเนื้อหา

แอตทริบิวต์:
android:authorities
รายการ Authority ของ URI อย่างน้อย 1 รายการที่ระบุข้อมูลที่ผู้ให้บริการเนื้อหาเสนอ ระบุ Authority หลายรายการโดยคั่นชื่อด้วยอัฒภาค ใช้แบบแผนการตั้งชื่อสไตล์ Java สำหรับชื่อ Authority เช่น com.example.provider.cartoonprovider เพื่อหลีกเลี่ยงความขัดแย้ง โดยปกติจะเป็นชื่อ ของคลาสย่อย ContentProvider ที่ใช้ผู้ให้บริการ

ไม่มีค่าเริ่มต้น ต้องระบุ Authority อย่างน้อย 1 รายการ

android:enabled
ระบุว่าระบบสร้างอินสแตนซ์ของผู้ให้บริการเนื้อหาได้หรือไม่ ค่าจะเป็น "true" หากสร้างได้ และ "false" หากสร้างไม่ได้ ค่าเริ่มต้น คือ "true"

องค์ประกอบ <application> มีแอตทริบิวต์ enabled ของตัวเองซึ่งใช้กับคอมโพเนนต์แอปพลิเคชันทั้งหมด รวมถึงผู้ให้บริการเนื้อหา แอตทริบิวต์ <application> และ <provider> ต้องมีค่าเป็น "true" ทั้งคู่ (ซึ่ง เป็นค่าเริ่มต้น) ผู้ให้บริการเนื้อหาจึงจะเปิดใช้ได้ หากแอตทริบิวต์ใดมีค่าเป็น "false" ผู้ให้บริการจะถูกปิดใช้ และจะสร้างอินสแตนซ์ไม่ได้

android:directBootAware

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

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

ค่าเริ่มต้นคือ "false"

android:exported
ระบุว่าแอปพลิเคชันอื่นๆ สามารถใช้ผู้ให้บริการเนื้อหาได้หรือไม่
  • "true": ผู้ให้บริการพร้อมให้แอปพลิเคชันอื่นๆ ใช้ แอปพลิเคชันใดก็ได้สามารถ ใช้ Content URI ของผู้ให้บริการเพื่อเข้าถึงผู้ให้บริการได้ โดยขึ้นอยู่กับสิทธิ์ที่ระบุไว้สำหรับ ผู้ให้บริการ
  • "false": ผู้ให้บริการไม่พร้อมให้แอปพลิเคชันอื่นๆ ใช้ ตั้งค่า android:exported="false" เพื่อจำกัดการเข้าถึงผู้ให้บริการไว้เฉพาะ แอปพลิเคชันของคุณ เฉพาะแอปพลิเคชันที่มี User ID (UID) เดียวกับผู้ให้บริการ หรือ แอปพลิเคชันที่ได้รับสิทธิ์เข้าถึงผู้ให้บริการชั่วคราวผ่าน android:grantUriPermissions เท่านั้นที่จะเข้าถึงผู้ให้บริการได้

เนื่องจากแอตทริบิวต์นี้เปิดตัวใน API ระดับ 17 อุปกรณ์ทั้งหมดที่ใช้ API ระดับ 16 ลงไปจึงทำงานราวกับว่าแอตทริบิวต์นี้ตั้งค่าเป็น "true" หากคุณตั้งค่า android:targetSdkVersion เป็น 17 ขึ้นไป ค่าเริ่มต้นจะเป็น "false" สำหรับอุปกรณ์ที่ใช้ API ระดับ 17 ขึ้นไป

คุณสามารถตั้งค่า android:exported="false" และยังคงจำกัดการเข้าถึง ผู้ให้บริการได้โดยการตั้งค่าสิทธิ์ด้วย permission แอตทริบิวต์

android:grantUriPermissions

ระบุว่าผู้ที่ปกติไม่มีสิทธิ์เข้าถึงข้อมูลของผู้ให้บริการเนื้อหาจะได้รับสิทธิ์เข้าถึงได้หรือไม่ ซึ่งจะเป็นการยกเลิกข้อจำกัดที่กำหนดโดยแอตทริบิวต์ readPermission, writePermission, permission และ exported ชั่วคราว

ค่าจะเป็น "true" หากให้สิทธิ์ได้ และ "false" หากให้สิทธิ์ไม่ได้ หากเป็น "true" ก็จะให้สิทธิ์เข้าถึงข้อมูลใดก็ได้ของผู้ให้บริการเนื้อหา หากเป็น "false" ก็จะให้สิทธิ์ได้เฉพาะ ชุดย่อยของข้อมูลที่ระบุไว้ใน <grant-uri-permission> องค์ประกอบย่อย (หากมี) ค่าเริ่มต้นคือ "false"

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

ในกรณีดังกล่าว สิทธิ์จะได้รับจากแฟล็ก FLAG_GRANT_READ_URI_PERMISSION และ FLAG_GRANT_WRITE_URI_PERMISSION ในออบเจ็กต์ Intent ที่เปิดใช้งานคอมโพเนนต์ ตัวอย่างเช่น แอปพลิเคชันอีเมลอาจใส่ FLAG_GRANT_READ_URI_PERMISSION ใน Intent ที่ส่งไปยัง Context.startActivity() สิทธิ์จะเฉพาะเจาะจงกับ URI ใน Intent

หากเปิดใช้ฟีเจอร์นี้โดยการตั้งค่าแอตทริบิวต์นี้เป็น "true" หรือโดยการกำหนด <grant-uri-permission> องค์ประกอบย่อย ให้เรียกใช้ Context.revokeUriPermission() เมื่อลบ URI ที่ครอบคลุมออกจากผู้ให้บริการ

ดูองค์ประกอบ <grant-uri-permission> ด้วย

android:icon
ไอคอนที่แสดงถึงผู้ให้บริการเนื้อหา แอตทริบิวต์นี้ตั้งค่าเป็นการอ้างอิงถึงทรัพยากร Drawable ที่มีคำจำกัดความของรูปภาพ หากไม่ได้ตั้งค่าไว้ ระบบจะใช้ไอคอนที่ระบุไว้สำหรับแอปพลิเคชันทั้งหมดแทน ดูข้อมูลเพิ่มเติมได้ที่แอตทริบิวต์ icon ขององค์ประกอบ <application>
android:initOrder
ลำดับการสร้างอินสแตนซ์ของผู้ให้บริการเนื้อหาเมื่อเทียบกับผู้ให้บริการเนื้อหาอื่นๆ ที่โฮสต์โดยกระบวนการเดียวกัน เมื่อผู้ให้บริการเนื้อหามีการพึ่งพาซึ่งกันและกัน การตั้งค่าแอตทริบิวต์นี้สำหรับผู้ให้บริการเนื้อหาแต่ละรายจะช่วยให้มั่นใจได้ว่าระบบจะสร้างผู้ให้บริการเนื้อหาตามลำดับที่การพึ่งพาเหล่านั้นกำหนด ค่าจะเป็นจำนวนเต็ม โดยระบบจะเริ่มต้นค่าที่สูงกว่าก่อน
android:intentMatchingFlags

ใช้แอตทริบิวต์นี้เพื่อปรับแต่งวิธีที่ระบบจับคู่ Intent ขาเข้าไปยังคอมโพเนนต์แอป โดยค่าเริ่มต้น ระบบจะไม่มีการใช้กฎการจับคู่พิเศษ

ค่าที่ตั้งไว้ในแท็ก <provider> จะลบล้างค่าที่ตั้งไว้ในแท็ก <application>

ค่าต้องเป็นแฟล็กอย่างน้อย 1 รายการต่อไปนี้ โดยคั่นด้วย "|"

แฟล็ก คำอธิบาย
none ปิดใช้กฎการจับคู่พิเศษทั้งหมดสำหรับ Intent ขาเข้า เมื่อ ระบุแฟล็กหลายรายการ ระบบจะแก้ไขค่าที่ขัดแย้งกันโดยให้ความสำคัญกับแฟล็ก none
enforceIntentFilter

บังคับใช้การจับคู่ที่เข้มงวดขึ้นสำหรับ Intent ขาเข้า

  • Intent ที่ชัดเจนต้องตรงกับ Intent Filter ของคอมโพเนนต์เป้าหมาย
  • Intent ที่ไม่มีการดำเนินการจะไม่ตรงกับ Intent Filter ใดๆ
allowNullAction

ผ่อนปรนกฎการจับคู่เพื่อให้ Intent ที่ไม่มีการดำเนินการตรงกันได้ แฟล็กนี้ใช้ร่วมกับ enforceIntentFilter เพื่อให้ได้ลักษณะการทำงานต่อไปนี้

  • Intent ที่ชัดเจนต้องตรงกับ Intent Filter ของคอมโพเนนต์เป้าหมาย
  • Intent ที่ไม่มีการดำเนินการจะตรงกับ Intent Filter ใดก็ได้

ดูข้อมูลเพิ่มเติมได้ที่ส่วน Safer Intents ในการเปลี่ยนแปลงลักษณะการทำงานของ Android 16 (API ระดับ 36)

android:label
ป้ายกำกับที่ผู้ใช้สามารถอ่านได้สำหรับเนื้อหาที่ให้ไว้ หากไม่ได้ตั้งค่าแอตทริบิวต์นี้ ระบบจะใช้ป้ายกำกับที่ตั้งไว้สำหรับแอปพลิเคชันทั้งหมดแทน ดูข้อมูลเพิ่มเติมได้ที่แอตทริบิวต์ ขององค์ประกอบ <application>label

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

android:multiprocess
หากแอปทำงานในหลายกระบวนการ แอตทริบิวต์นี้จะกำหนดว่าระบบจะสร้างอินสแตนซ์ของผู้ให้บริการเนื้อหาหลายรายการหรือไม่ หากเป็น "true" กระบวนการแต่ละอย่างของแอปจะมีออบเจ็กต์ผู้ให้บริการเนื้อหาของตัวเอง หากเป็น "false" กระบวนการของแอปจะแชร์ออบเจ็กต์ผู้ให้บริการเนื้อหาเพียงรายการเดียว ค่าเริ่มต้นคือ "false"

การตั้งค่าแฟล็กนี้เป็น "true" จะช่วยปรับปรุงประสิทธิภาพโดยการลดค่าใช้จ่ายในการสื่อสารระหว่างกระบวนการ แต่ก็เพิ่มการใช้หน่วยความจำของแต่ละกระบวนการด้วย

android:name
ชื่อของคลาสที่ใช้ผู้ให้บริการเนื้อหา ซึ่งเป็นคลาสย่อยของ ContentProvider โดยปกติจะเป็นชื่อคลาสที่ระบุอย่างครบถ้วน เช่น "com.example.project.TransportationProvider" อย่างไรก็ตาม หากอักขระแรกของชื่อเป็นจุด ระบบจะต่อท้ายชื่อแพ็กเกจที่ระบุไว้ใน <manifest> องค์ประกอบ

ไม่มีค่าเริ่มต้น ต้องระบุชื่อ

android:permission

ชื่อสิทธิ์ที่ไคลเอ็นต์ต้องมีเพื่ออ่านหรือเขียนข้อมูลของผู้ให้บริการเนื้อหา แอตทริบิวต์นี้เป็นวิธีที่สะดวกในการตั้งค่าสิทธิ์เดียวสำหรับการอ่านและการเขียน อย่างไรก็ตาม แอตทริบิวต์ readPermission, writePermission และ grantUriPermissions จะมีความสำคัญเหนือแอตทริบิวต์นี้

หากตั้งค่าแอตทริบิวต์ readPermission ไว้ด้วย แอตทริบิวต์นี้จะควบคุมการเข้าถึงสำหรับการค้นหาผู้ให้บริการเนื้อหา หากตั้งค่าแอตทริบิวต์ writePermission ไว้ แอตทริบิวต์นี้จะควบคุมการเข้าถึงสำหรับการแก้ไขข้อมูลของผู้ให้บริการ

ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์ได้ที่ ส่วนสิทธิ์ ในภาพรวมของ Manifest ของแอปและ เคล็ดลับด้านความปลอดภัย

android:process

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

องค์ประกอบ <application>แอตทริบิวต์ process สามารถตั้งค่า เริ่มต้นอื่นสำหรับคอมโพเนนต์ทั้งหมดได้ แต่คอมโพเนนต์แต่ละรายการสามารถลบล้างค่าเริ่มต้นด้วยแอตทริบิวต์ process ของตัวเอง ซึ่งช่วยให้คุณกระจายแอปพลิเคชันไปทำงานในหลายกระบวนการได้

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

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

android:readPermission

สิทธิ์ที่ไคลเอ็นต์ต้องมีเพื่อค้นหาผู้ให้บริการเนื้อหา

หากผู้ให้บริการตั้งค่า android:grantUriPermissions เป็น "true" หรือหากไคลเอ็นต์ที่กำหนดเป็นไปตามเงื่อนไขของ <grant-uri-permission> องค์ประกอบย่อย ไคลเอ็นต์จะได้รับสิทธิ์อ่านข้อมูลของผู้ให้บริการเนื้อหาชั่วคราว

ดูแอตทริบิวต์ permission และ writePermission ด้วย

android:syncable
ระบุว่าข้อมูลที่อยู่ภายใต้การควบคุมของผู้ให้บริการเนื้อหาสามารถซิงค์กับข้อมูลในเซิร์ฟเวอร์ได้หรือไม่ ค่าจะเป็น "true" หากซิงค์ได้ และ "false" หากซิงค์ไม่ได้
android:writePermission

สิทธิ์ที่ไคลเอ็นต์ต้องมีเพื่อทำการเปลี่ยนแปลงข้อมูลที่ผู้ให้บริการเนื้อหาควบคุม

หากผู้ให้บริการตั้งค่า android:grantUriPermissions เป็น "true" หรือหากไคลเอ็นต์ที่กำหนดเป็นไปตามเงื่อนไขขององค์ประกอบย่อย <grant-uri-permission> ไคลเอ็นต์จะได้รับสิทธิ์เขียนข้อมูลของผู้ให้บริการเนื้อหาชั่วคราวเพื่อแก้ไขข้อมูล

ดูแอตทริบิวต์ permission และ readPermission ด้วย

เปิดตัวใน:
API ระดับ 1
ดูเพิ่มเติม:
ผู้ให้บริการเนื้อหา