<service>

ไวยากรณ์:
<service android:description="string resource"
         android:directBootAware=["true" | "false"]
         android:enabled=["true" | "false"]
         android:exported=["true" | "false"]
         android:foregroundServiceType=["camera" | "connectedDevice" |
                                        "dataSync" | "health" | "location" |
                                        "mediaPlayback" | "mediaProjection" |
                                        "microphone" | "phoneCall" |
                                        "remoteMessaging" | "shortService" |
                                        "specialUse" | "systemExempted"]
         android:icon="drawable resource"
         android:intentMatchingFlags=["none" | "enforceIntentFilter" | "allowNullAction"]
         android:isolatedProcess=["true" | "false"]
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string"
         android:stopWithTask=["true" | "false"]>
    ...
</service>
มีอยู่ใน
<application>
อาจมีข้อมูลต่อไปนี้
<intent-filter>
<meta-data>
<property>
คำอธิบาย:
ประกาศบริการ ซึ่งเป็นServiceคลาสย่อย เป็นหนึ่งใน คอมโพเนนต์ของแอปพลิเคชัน ซึ่งต่างจากกิจกรรมตรงที่บริการไม่มี อินเทอร์เฟซผู้ใช้แบบภาพ โดยใช้เพื่อการดำเนินการในเบื้องหลังที่ใช้เวลานาน หรือ API การสื่อสารที่สมบูรณ์ซึ่งแอปพลิเคชันอื่นๆ เรียกใช้ได้

บริการทั้งหมดต้องแสดงด้วยองค์ประกอบ <service> ในไฟล์ Manifest หากไม่ได้ประกาศไว้ที่นั่น ระบบจะไม่เห็นและจะไม่เรียกใช้

หมายเหตุ: ใน Android 8.0 (API ระดับ 26) ขึ้นไป ระบบจะจำกัด สิ่งที่แอปทำได้ขณะทำงานในเบื้องหลัง ดูข้อมูลเพิ่มเติมได้ในคำแนะนำที่อธิบายถึงขีดจำกัดการดำเนินการในเบื้องหลังและขีดจำกัดตำแหน่งในเบื้องหลัง

แอตทริบิวต์
android:description
สตริงที่ผู้ใช้อ่านได้ซึ่งอธิบายบริการ คำอธิบายจะตั้งค่าเป็น การอ้างอิงไปยังทรัพยากรสตริง เพื่อให้แปลเป็นภาษาท้องถิ่นได้เหมือนสตริงอื่นๆ ในอินเทอร์เฟซผู้ใช้
android:directBootAware

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

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

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

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

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

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

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

แอตทริบิวต์นี้ไม่ใช่เพียงวิธีเดียวในการจำกัดการเปิดเผยบริการต่อแอปพลิเคชันอื่นๆ คุณยังใช้สิทธิ์เพื่อจำกัดเอนทิตีภายนอกที่ โต้ตอบกับบริการได้ด้วย ดูแอตทริบิวต์ permission

android:foregroundServiceType

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

คุณกำหนดประเภทบริการที่ทำงานอยู่เบื้องหน้าหลายประเภทให้กับบริการหนึ่งๆ ได้

android:icon

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

ไอคอนของบริการ ไม่ว่าจะตั้งค่าที่นี่หรือโดยองค์ประกอบ <application> ก็เป็นไอคอนเริ่มต้นสำหรับตัวกรอง Intent ของบริการทั้งหมดด้วย ดูแอตทริบิวต์iconขององค์ประกอบ <intent-filter>

android:intentMatchingFlags

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

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

ค่าต้องเป็นค่าสถานะต่อไปนี้อย่างน้อย 1 รายการ โดยคั่นด้วย "|"

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

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

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

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

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

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

android:isolatedProcess
หากตั้งค่าเป็น "true" บริการนี้จะทำงานภายใต้กระบวนการพิเศษที่แยกจากส่วนอื่นๆ ของระบบและไม่มีสิทธิ์ของตัวเอง การสื่อสารกับอุปกรณ์นี้จะทำได้ผ่าน Service API เท่านั้น โดยต้องมีการเชื่อมโยงและเริ่มต้น
android:label
ชื่อที่ผู้ใช้อ่านได้สำหรับบริการ หากไม่ได้ตั้งค่าแอตทริบิวต์นี้ ระบบจะใช้ป้ายกำกับที่ตั้งไว้สำหรับแอปพลิเคชันโดยรวมแทน ดูแอตทริบิวต์ label ขององค์ประกอบ <application>

ป้ายกำกับของบริการ ไม่ว่าจะตั้งค่าที่นี่หรือโดยองค์ประกอบ <application> ก็เป็นป้ายกำกับเริ่มต้นสำหรับตัวกรอง Intent ของบริการทั้งหมดด้วย ดูแอตทริบิวต์labelขององค์ประกอบ <intent-filter>

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

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

เมื่อเผยแพร่แอปพลิเคชันแล้ว อย่า เปลี่ยนชื่อนี้ เว้นแต่คุณจะตั้งค่า android:exported="false"

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

android:permission
ชื่อของสิทธิ์ที่เอนทิตีต้องมีเพื่อเปิดตัวบริการหรือเชื่อมโยงกับบริการ หากผู้โทรของ startService(), bindService() หรือ stopService() ไม่ได้รับสิทธิ์นี้ วิธีการจะไม่ทำงานและระบบจะไม่ส่งออบเจ็กต์ Intent ไปยังบริการ

หากไม่ได้ตั้งค่าแอตทริบิวต์นี้ ชุดสิทธิ์ที่ตั้งค่าโดยแอตทริบิวต์ <application>ขององค์ประกอบ permission จะมีผลกับบริการ หากไม่ได้ตั้งค่าแอตทริบิวต์ใดไว้ บริการจะไม่ได้รับการป้องกันโดยสิทธิ์

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

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

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

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

android:stopWithTask
หากตั้งค่าเป็น "true" ระบบจะหยุดบริการโดยอัตโนมัติ เมื่อผู้ใช้นำงานที่มาจากกิจกรรมที่แอปเป็นเจ้าของออก ค่าเริ่มต้นคือ "false"
ดูเพิ่มเติม:
<application>
<activity>
เปิดตัวใน
ระดับ API 1