<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: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 เป็นคลาสย่อยของ ContentProvider ที่ให้การเข้าถึงข้อมูลที่มีโครงสร้างซึ่งจัดการโดยแอปพลิเคชัน คุณต้องกำหนดผู้ให้บริการเนื้อหาทั้งหมดในแอปพลิเคชันไว้ในองค์ประกอบ <provider> ในไฟล์ Manifest มิฉะนั้น ระบบจะไม่รู้จักไฟล์เหล่านั้น และจะไม่เรียกใช้

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

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

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

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

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

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

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

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

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

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

android:directBootAware

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

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

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

android:exported
ไม่ว่าผู้ให้บริการเนื้อหาจะพร้อมให้แอปพลิเคชันอื่นๆ ใช้งานหรือไม่
  • "true": ผู้ให้บริการพร้อมให้บริการแก่แอปพลิเคชันอื่นๆ แอปพลิเคชันใดก็ได้ ใช้ URI เนื้อหาของผู้ให้บริการเพื่อเข้าถึงได้ โดยขึ้นอยู่กับสิทธิ์ที่ระบุสำหรับ ผู้ให้บริการ
  • "false": ผู้ให้บริการไม่พร้อมให้บริการแก่แอปพลิเคชันอื่นๆ ตั้งค่า android:exported="false" เพื่อจำกัดการเข้าถึงผู้ให้บริการสำหรับแอปพลิเคชัน ของคุณ เฉพาะแอปพลิเคชันที่มีรหัสผู้ใช้ (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
ไอคอนที่แสดงถึงผู้ให้บริการเนื้อหา แอตทริบิวต์นี้ตั้งค่าเป็นการอ้างอิงไปยังทรัพยากรที่วาดได้ซึ่งมี คำจำกัดความของรูปภาพ หากไม่ได้ตั้งค่าไว้ ระบบจะใช้ไอคอนที่ระบุสำหรับแอปพลิเคชัน โดยรวมแทน ดูข้อมูลเพิ่มเติมได้ที่แอตทริบิวต์ icon ขององค์ประกอบ <application>
android:initOrder
ลำดับการสร้างอินสแตนซ์ของผู้ให้บริการเนื้อหา เมื่อเทียบกับผู้ให้บริการเนื้อหารายอื่นๆ ที่โฮสต์โดยกระบวนการเดียวกัน เมื่อผู้ให้บริการเนื้อหามีการพึ่งพาซึ่งกันและกัน การตั้งค่าแอตทริบิวต์นี้สำหรับผู้ให้บริการเนื้อหาแต่ละรายจะช่วยให้มั่นใจได้ว่าระบบจะสร้างผู้ให้บริการเนื้อหาตามลำดับที่การพึ่งพาเหล่านั้นกำหนด ค่านี้เป็นจำนวนเต็ม โดยระบบจะเริ่มต้นหมายเลขที่สูงกว่าก่อน
android:label
ป้ายกำกับที่ผู้ใช้อ่านได้สำหรับเนื้อหาที่ระบุ หากไม่ได้ตั้งค่าแอตทริบิวต์นี้ ระบบจะใช้ป้ายกำกับที่ตั้งไว้สำหรับแอปพลิเคชันโดยรวมแทน ดูข้อมูลเพิ่มเติมได้ที่แอตทริบิวต์ label ขององค์ประกอบ <application>

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

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

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

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

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

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

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

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

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

แอตทริบิวต์ processขององค์ประกอบ <application>สามารถตั้งค่า เริ่มต้นที่แตกต่างกันสำหรับคอมโพเนนต์ทั้งหมดได้ แต่คอมโพเนนต์แต่ละรายการจะลบล้างค่าเริ่มต้นได้ ด้วยแอตทริบิวต์ 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
ดูเพิ่มเติม:
ผู้ให้บริการเนื้อหา