เขียนแอป Android ได้โดยใช้ Kotlin, ภาษาโปรแกรม Java และภาษา C++ คอมไพล์เครื่องมือ Android SDK โค้ดพร้อมด้วยไฟล์ข้อมูลและทรัพยากรลงใน APK หรือ Android App Bundle
แพ็กเกจ Android ซึ่งเป็นไฟล์ที่เก็บถาวรที่มีคำต่อท้ายเป็น .apk
จะมี
เนื้อหาของแอป Android ที่ต้องใช้ขณะรันไทม์ และเป็นไฟล์ที่ขับเคลื่อนด้วย Android
ที่อุปกรณ์ใช้ติดตั้งแอป
Android App Bundle ซึ่งเป็นไฟล์ที่เก็บถาวรที่มีคำต่อท้ายเป็น .aab
เนื้อหาของโปรเจ็กต์แอป Android ซึ่งรวมถึงข้อมูลเมตาเพิ่มเติมบางส่วนที่ไม่จำเป็น
รันไทม์ AAB คือรูปแบบการเผยแพร่และไม่สามารถติดตั้งในอุปกรณ์ Android ทั้งนี้
เลื่อนการสร้าง APK และลงชื่อเข้าใช้ไปยังขั้นตอนต่อไป
เมื่อเผยแพร่แอปผ่าน Google ตัวอย่างเช่น เซิร์ฟเวอร์ของ Google Play สร้าง APK ที่มีการเพิ่มประสิทธิภาพซึ่งมีเฉพาะทรัพยากรและ ที่อุปกรณ์หนึ่งๆ จำเป็นต้องใช้ในการติดตั้งแอป
แอป Android แต่ละแอปอยู่ในแซนด์บ็อกซ์ความปลอดภัยของตนเอง ซึ่งได้รับการปกป้องโดย ฟีเจอร์ความปลอดภัยของ Android ดังต่อไปนี้
- ระบบปฏิบัติการ Android คือระบบ Linux ที่มีผู้ใช้หลายคน ซึ่งแต่ละแอปคือ ผู้ใช้รายอื่น
- โดยค่าเริ่มต้น ระบบจะกำหนดรหัสผู้ใช้ Linux ที่ไม่ซ้ำกันให้กับแต่ละแอป ซึ่งใช้โดย ระบบและแอปดังกล่าวไม่รู้จัก ระบบจะตั้งค่าสิทธิ์สำหรับไฟล์ทั้งหมดใน เพื่อให้มีเพียงรหัสผู้ใช้ที่กำหนดให้กับแอปเท่านั้นที่เข้าถึงได้
- แต่ละกระบวนการจะมีเครื่องเสมือน (VM) ของตัวเอง ดังนั้นโค้ดของแอปจะทำงานโดยแยกออกจาก แอปอื่นๆ
- โดยค่าเริ่มต้น ทุกแอปจะทำงานในกระบวนการของ Linux ของตัวเอง ระบบ Android เริ่มทำงาน กระบวนการเมื่อ คอมโพเนนต์ของแอปต้องได้รับการดำเนินการ จากนั้นปิดกระบวนการ เมื่อไม่มีโอกาสแล้ว หรือเมื่อระบบต้องกู้คืนหน่วยความจำสำหรับแอปอื่นๆ
ระบบ Android ใช้หลักการให้สิทธิ์ขั้นต่ำ นั่นคือ โดยค่าเริ่มต้น แต่ละแอปจะมีสิทธิ์เข้าถึงเฉพาะคอมโพเนนต์ที่ต้องใช้ในการทำงาน และ เท่านี้ก็เรียบร้อย การดำเนินการนี้จะสร้างสภาพแวดล้อมที่ปลอดภัยมากซึ่งแอปไม่สามารถเข้าถึงส่วนต่างๆ ของ ที่ไม่ได้รับอนุญาต
แต่ก็ยังมีวิธีที่แอปสามารถแชร์ กับแอปอื่นๆ และสำหรับ แอปเพื่อเข้าถึงบริการของระบบ:
- คุณสามารถจัดการแอป 2 แอปให้ใช้รหัสผู้ใช้ Linux เดียวกันได้ ซึ่งในกรณีนี้ ให้เข้าถึงไฟล์ของกันและกันได้ หากต้องการประหยัดทรัพยากรของระบบ แอปที่มี รหัสผู้ใช้เดียวกันสามารถจัดเรียงในกระบวนการของ Linux เดียวกันและแชร์ VM เดียวกันได้ จะต้องรับรองแอปด้วยใบรับรองเดียวกันด้วย
- แอปสามารถขอสิทธิ์เข้าถึงข้อมูลอุปกรณ์ เช่น อุปกรณ์ ตำแหน่ง กล้อง และการเชื่อมต่อบลูทูธ ผู้ใช้มี ที่จะให้สิทธิ์เหล่านี้อย่างชัดเจน ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์ได้ที่ สิทธิ์ใน Android
ส่วนที่เหลือของเอกสารนี้จะอธิบายแนวคิดต่อไปนี้:
- องค์ประกอบหลักของเฟรมเวิร์กที่กำหนดแอปของคุณ
- ไฟล์ Manifest ที่คุณประกาศคอมโพเนนต์และอุปกรณ์ที่จำเป็น สำหรับ แอป
- ทรัพยากรที่แยกจากโค้ดของแอปและที่ทำให้แอปของคุณ ปรับลักษณะการทำงานให้เหมาะสำหรับการกำหนดค่าอุปกรณ์ต่างๆ ได้อย่างดี
คอมโพเนนต์ของแอป
คอมโพเนนต์ของแอปคือองค์ประกอบสำคัญของแอป Android ชิ้น คอมโพเนนต์คือจุดแรกเข้าที่ระบบหรือผู้ใช้เข้าสู่แอปของคุณ ใช้บ้าง ที่ขึ้นอยู่กับคอมโพเนนต์อื่น
คอมโพเนนต์ของแอปมีด้วยกัน 4 ประเภทดังนี้
- กิจกรรม
- บริการ
- Broadcast Receiver
- ผู้ให้บริการเนื้อหา
แต่ละประเภทมีจุดประสงค์ที่แตกต่างกัน และมีวงจรการใช้งานที่แตกต่างกันซึ่งกำหนดวิธีการสร้างและทำลายคอมโพเนนต์ ส่วนต่อไปนี้จะอธิบายองค์ประกอบของแอป 4 ประเภท
- กิจกรรม
- กิจกรรมคือจุดแรกเข้าในการโต้ตอบกับผู้ใช้ ซึ่งแสดง
หน้าจอที่มีอินเทอร์เฟซผู้ใช้ ตัวอย่างเช่น
แอปอีเมลอาจมีกิจกรรมหนึ่งที่แสดงรายการใหม่
อีเมล กิจกรรมอื่นในการเขียนอีเมล และกิจกรรมอื่นสำหรับการอ่านอีเมล แม้ว่า
กิจกรรมจะทำงานร่วมกันเพื่อสร้างประสบการณ์ของผู้ใช้ที่สอดคล้องกันในแอปอีเมล
เป็นอิสระจากกัน
แอปอื่นสามารถเริ่มรายการใดรายการหนึ่งต่อไปนี้ กิจกรรมหากแอปอีเมลอนุญาต เช่น แอปกล้องถ่ายรูปอาจเริ่มต้น กิจกรรมในแอปอีเมลสำหรับเขียนอีเมลใหม่เพื่อให้ผู้ใช้แชร์รูปภาพได้
กิจกรรมช่วยอำนวยความสะดวกในการโต้ตอบที่สำคัญระหว่างระบบกับแอปดังต่อไปนี้
- การติดตามสิ่งที่ผู้ใช้สนใจในปัจจุบัน ซึ่งก็คืออะไรบนหน้าจอ เพื่อที่ว่า ระบบจะยังคงประมวลผลโปรเซสที่โฮสต์กิจกรรมอยู่ต่อไป
- การทราบว่ากระบวนการที่ใช้ก่อนหน้านี้รายการใดมีกิจกรรมที่หยุดลงแล้วซึ่งผู้ใช้อาจกลับไปใช้ และให้ความสำคัญกับกระบวนการเหล่านั้นมากขึ้นเพื่อให้พร้อมใช้งานต่อไป
- ช่วยแอปหยุดการจัดการกระบวนการเพื่อให้ผู้ใช้กลับไปยังกิจกรรมได้ ด้วยการคืนค่าสถานะก่อนหน้า
- ทำให้แอปสามารถใช้การไหลเวียนของผู้ใช้ระหว่างกัน และเพื่อให้ระบบ ประสานงานกับขั้นตอนเหล่านี้ ตัวอย่างหลักคือการแชร์
คุณใช้กิจกรรมเป็นคลาสย่อยของคลาส
Activity
สำหรับข้อมูลเพิ่มเติม ข้อมูลเกี่ยวกับชั้นเรียนActivity
โปรดดู ข้อมูลเบื้องต้นเกี่ยวกับกิจกรรม - บริการ
- บริการคือจุดแรกเข้าสำหรับจุดประสงค์ทั่วไปที่ทำให้แอปทำงานอยู่เบื้องหลัง
ด้วยเหตุผลทุกประการ เป็นคอมโพเนนต์ที่ทำงานในเบื้องหลังเพื่อทำการทดสอบเป็นเวลานาน
หรือเพื่อทำงานสำหรับกระบวนการระยะไกล บริการไม่มีอินเทอร์เฟซผู้ใช้
สำหรับ ตัวอย่างเช่น บริการอาจเล่นเพลงขณะล็อกหน้าจอหรือขณะใช้แอปอื่นขณะที่ผู้ใช้อยู่ในแอปอื่น หรือ อาจมีการดึงข้อมูลผ่านเครือข่ายโดยไม่บล็อกการโต้ตอบของผู้ใช้กับกิจกรรม เพิ่มอีก คอมโพเนนต์ เช่น กิจกรรม สามารถเริ่มต้นบริการและปล่อยให้ทำงานหรือเชื่อมโยงกับบริการได้ โต้ตอบกับแอป
บริการ 2 ประเภทที่แจ้งวิธีจัดการแอปแก่ระบบ ได้แก่ บริการที่เริ่มต้นแล้ว บริการที่มีผลผูกพัน
บริการที่เริ่มต้นแล้วจะแจ้งให้ระบบทำงานต่อไปจนกระทั่งงานเสร็จสมบูรณ์ โดยการดำเนินการนี้อาจเป็นการซิงค์ข้อมูลบางอย่างในเบื้องหลังหรือเล่นเพลงแม้เมื่อผู้ใช้ออกจากแอปแล้ว การซิงค์ข้อมูลในพื้นหลังหรือการเล่นเพลงแสดงถึงการเริ่มประเภทต่างๆ ที่ระบบจะจัดการกับบริการแตกต่างกัน:
- การเล่นเพลงเป็นสิ่งที่ผู้ใช้ทราบโดยตรงและแอปสื่อสารเรื่องนี้กับ ระบบด้วยการระบุว่าระบบต้องการทำงานอยู่เบื้องหน้า พร้อมมีการแจ้งเตือนให้บอก ผู้ใช้ที่เรียกใช้อยู่ ในกรณีนี้ ระบบจะให้ความสำคัญกับการรักษา กระบวนการกำลังทำงาน เนื่องจากผู้ใช้จะได้รับประสบการณ์ที่ไม่ดีหากโค้ดหายไป
- บริการที่ทำงานอยู่เบื้องหลังปกติไม่ใช่สิ่งที่ผู้ใช้ทราบโดยตรง ดังนั้น ระบบจะมีอิสระมากขึ้นในการจัดการกระบวนการ มันอาจปล่อยให้ถูกฆ่าตายไปเลย รีสตาร์ทบริการในภายหลัง หากจำเป็นต้องใช้ RAM สำหรับบางรายการที่มีมาก ความกังวลของผู้ใช้ได้ทันที
บริการขอบเขตทำงานเนื่องจากแอปอื่นๆ (หรือระบบ) ได้ระบุว่าต้องการใช้บริการ service. บริการที่มีผลผูกพันจะให้ API แก่กระบวนการอื่น และระบบ รู้ว่ามีความจำเป็นต้องพึ่งพากันระหว่างกระบวนการเหล่านี้ ดังนั้น หากกระบวนการ A ผูกกับบริการใน กระบวนการ B ระบบจะรู้ว่าจะต้องทำให้กระบวนการ B และบริการของ A ทำงานต่อไป เพิ่มเติม หาก กระบวนการ A คือสิ่งที่ผู้ใช้สนใจ จากนั้นทราบว่ากระบวนการ B เป็นสิ่งที่ ที่ผู้ใช้ก็สนใจเช่นกัน
บริการจึงมีประโยชน์เนื่องจากความยืดหยุ่น องค์ประกอบพื้นฐาน สำหรับแนวคิดระบบในระดับที่สูงกว่าได้ วอลเปเปอร์เคลื่อนไหว การแจ้งเตือน Listener ภาพพักหน้าจอ วิธีการป้อนข้อมูล บริการช่วยเหลือพิเศษ และฟีเจอร์หลักอื่นๆ ของระบบ ทั้งหมดนี้สร้างขึ้นเป็นบริการที่แอปพลิเคชันนำมาใช้และระบบจะเชื่อมโยงถึงเมื่อทำงาน
มีการใช้งานบริการเป็นคลาสย่อยของ
Service
หากต้องการดูข้อมูลเพิ่มเติม เกี่ยวกับชั้นเรียนService
โปรดดู ภาพรวมของบริการหมายเหตุ: หากแอปกำหนดเป้าหมายเป็น Android 5.0 (API ระดับ 21) ขึ้นไป ใช้คลาส
JobScheduler
เพื่อตั้งเวลาการดำเนินการ JobScheduler มี ประโยชน์ของการประหยัดแบตเตอรี่ด้วยการกำหนดเวลางานเพื่อลดการใช้พลังงานอย่างเหมาะสมที่สุด และการทำงานร่วมกับ Doze API ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ชั้นเรียนนี้ได้ที่JobScheduler
เอกสารอ้างอิง - เครื่องรับสัญญาณประกาศ
- ตัวรับสัญญาณประกาศเป็นคอมโพเนนต์ที่ช่วยให้ระบบส่งเหตุการณ์ไปยัง
แอปที่อยู่นอกขั้นตอนของผู้ใช้ตามปกติ เพื่อให้แอปตอบสนองต่อการออกอากาศทั้งระบบได้
ประกาศ เนื่องจาก Broadcast Receiver เป็นอีกประเภทหนึ่งที่
สามารถเข้าใช้งานแอปได้ ระบบจึง
ส่งการออกอากาศได้แม้ในแอปที่ไม่ได้ทำงานอยู่
ตัวอย่างเช่น แอปสามารถ ตั้งเวลาปลุกเพื่อโพสต์การแจ้งเตือนเพื่อบอกผู้ใช้เกี่ยวกับกิจกรรมที่กําลังจะมาถึง เนื่องจากระบบจะส่งการปลุกไปยัง
BroadcastReceiver
ในแอป แอปจึงไม่ต้องทำอะไร จะยังคงทำงานอยู่จนกว่านาฬิกาปลุกจะดังการแพร่สัญญาณจำนวนมากมาจากระบบ เช่น การประกาศที่บอกว่าหน้าจอปิดอยู่ แบตเตอรี่เหลือน้อยหรือมีการจับภาพ แอปยังสามารถเริ่มการออกอากาศได้ เช่น เพื่อให้แอปอื่นๆ ทราบว่า ข้อมูลบางอย่างจะดาวน์โหลดลงในอุปกรณ์และจะพร้อมใช้งาน
แม้ว่าการออกอากาศ ผู้รับไม่แสดงอินเทอร์เฟซผู้ใช้ แต่สามารถสร้างการแจ้งเตือนในแถบสถานะได้ เพื่อแจ้งเตือนผู้ใช้เมื่อมีการออกอากาศ แต่โดยทั่วไปจะใช้ Broadcast Receiver เป็นเพียงเกตเวย์ไปยังคอมโพเนนต์อื่นๆ และมีจุดประสงค์เพื่อให้ทำงานได้ในจำนวนน้อยมาก
ตัวอย่างเช่น Broadcast Receiver อาจกำหนดเวลา
JobService
ให้ทำงานบางอย่างตาม ในกิจกรรมโดยใช้JobScheduler
Broadcast Receiver มักเกี่ยวข้องกับการโต้ตอบระหว่างแอป ดังนั้นคุณควรทราบว่า ผลกระทบด้านความปลอดภัยเมื่อตั้งค่าBroadcast Receiver มีการใช้งานเป็นคลาสย่อยของ
BroadcastReceiver
และการออกอากาศแต่ละครั้งจะส่งเป็นออบเจ็กต์Intent
สำหรับข้อมูลเพิ่มเติม ดูชั้นเรียนBroadcastReceiver
- ผู้ให้บริการเนื้อหา
- ผู้ให้บริการเนื้อหาจะจัดการชุดข้อมูลแอปที่ใช้ร่วมกันซึ่งคุณเก็บได้
ระบบไฟล์ ในฐานข้อมูล SQLite บนเว็บ หรือในพื้นที่เก็บข้อมูลถาวรอื่นๆ
สถานที่ที่
สามารถเข้าถึงได้ แอปอื่นๆ สามารถค้นหาหรือแก้ไขผ่านผู้ให้บริการเนื้อหาได้
ข้อมูลนั้น หากผู้ให้บริการเนื้อหาอนุญาต
เช่น ระบบ Android จะจัดเตรียมเนื้อหา ที่จัดการข้อมูลติดต่อของผู้ใช้ แอปใดๆ ที่มี สิทธิ์นั้นสามารถค้นหาผู้ให้บริการเนื้อหาได้ เช่น การใช้
ContactsContract.Data
เพื่ออ่านและเขียนข้อมูลเกี่ยวกับ บุคคลใดบุคคลหนึ่งโดยเฉพาะคุณอาจคิดว่าผู้ให้บริการเนื้อหาเป็นเสมือนนามธรรมในฐานข้อมูล เนื่องจากมี API และการสนับสนุน ที่มีอยู่ในตัวสำหรับกรณีทั่วไปนั้น แต่ก็มีช่องทำเครื่องหมาย วัตถุประสงค์หลักจากมุมมองของการออกแบบระบบ
ในระบบ ผู้ให้บริการเนื้อหาคือจุดแรกเข้าของแอปเพื่อเผยแพร่รายการข้อมูลที่มีชื่อ ที่ระบุโดยรูปแบบ URI ดังนั้น แอปจะตัดสินใจได้ว่าต้องการแมปข้อมูลที่มีอยู่อย่างไร เนมสเปซ URI โดยส่ง URI เหล่านั้นให้กับเอนทิตีอื่นๆ ซึ่งในทางกลับกันก็อาจใช้ URI เพื่อเข้าถึง ความสามารถบางอย่างที่ช่วยให้ระบบสามารถจัดการแอปได้มีดังนี้
- การกำหนด URI ไม่ได้กำหนดให้แอปต้องทำงานต่อ ดังนั้น URI จึงสามารถคงอยู่หลัง การออกจากแอปที่เป็นเจ้าของ ระบบต้องการตรวจสอบเพียงว่าแอปที่เป็นเจ้าของ ยังคงทำงานอยู่เมื่อแอปดึงข้อมูลแอปจาก URI ที่เกี่ยวข้อง
- URI เหล่านี้มีโมเดลการรักษาความปลอดภัยที่สำคัญซึ่งมีรายละเอียดปลีกย่อยอีกด้วย ตัวอย่างเช่น แอปสามารถวาง URI ของรูปภาพที่มีในคลิปบอร์ด แต่ยังคงเก็บเนื้อหาไว้ ล็อกผู้ให้บริการ ดังนั้น แอปพลิเคชันอื่นๆ จะไม่สามารถ เข้าถึงได้อย่างอิสระ เมื่อแอปที่สองพยายาม เพื่อเข้าถึง URI ดังกล่าวในคลิปบอร์ด ระบบจะอนุญาตให้แอปดังกล่าว เข้าถึงข้อมูลโดยใช้การให้สิทธิ์ URI ชั่วคราว แอปจึงเข้าถึงข้อมูลที่อยู่หลัง URI นั้นเท่านั้น และเข้าถึงในแอปที่ 2 ไม่ได้เลย
ผู้ให้บริการเนื้อหายังมีประโยชน์สำหรับการอ่านและการเขียนข้อมูลที่เป็นข้อมูลส่วนตัวสำหรับ แอปและไม่มีการแชร์
มีการใช้งานผู้ให้บริการเนื้อหาเป็นคลาสย่อยของ
ContentProvider
และต้องใช้ชุด API มาตรฐานที่ทำให้แอปอื่นๆ ทำงานได้ ธุรกรรม สำหรับข้อมูลเพิ่มเติม โปรดดูที่นักพัฒนาซอฟต์แวร์ผู้ให้บริการเนื้อหา
แง่มุมที่ไม่เหมือนใครของการออกแบบระบบ Android คือทุกแอปสามารถเริ่ม คอมโพเนนต์ของแอป เช่น ถ้าต้องการให้ผู้ใช้บันทึก ด้วยกล้องของอุปกรณ์ อาจมีแอปอื่นที่ทำแบบนั้น และ ก็ใช้แอปแทนการสร้างกิจกรรมเพื่อถ่ายภาพด้วยตัวเอง ไม่ได้นะ จะต้องมีหรือแม้แต่ลิงก์ไปยังโค้ดจากแอปกล้องถ่ายรูป แต่คุณสามารถเริ่มกิจกรรมในแอปกล้องที่จับภาพ รูปภาพ เมื่อเสร็จแล้ว ระบบจะส่งรูปภาพกลับไปที่แอปเพื่อให้คุณใช้งานได้ ถึงผู้ใช้ ดูเหมือนว่ากล้องเป็นส่วนหนึ่งของแอป
เมื่อระบบเริ่มคอมโพเนนต์ จะเป็นการเริ่มกระบวนการสำหรับแอปนั้นๆ หากไม่ได้
ทำงานอยู่แล้ว และสร้างอินสแตนซ์คลาสที่จำเป็นสำหรับคอมโพเนนต์ ตัวอย่างเช่น หาก
แอปจะเริ่มกิจกรรมในแอปกล้องที่จับภาพกิจกรรมดังกล่าว
ทำงานในกระบวนการของแอปกล้อง ไม่ใช่ในกระบวนการของแอป
ดังนั้น แอป Android ไม่ได้มีเพียงแอปเดียวในระบบ ซึ่งต่างจากแอปในระบบอื่นๆ ส่วนใหญ่
คะแนน: ไม่มีฟังก์ชัน main()
เนื่องจากระบบเรียกใช้แต่ละแอปในกระบวนการที่แยกจากกันโดยมีสิทธิ์ไฟล์ที่ จำกัดการเข้าถึงแอปอื่นๆ แอปของคุณไม่สามารถเปิดใช้งานคอมโพเนนต์โดยตรงจาก แอปอื่น แต่ระบบ Android ทำได้ วิธีเปิดใช้งานคอมโพเนนต์ใน อีกแอปหนึ่ง คุณส่งข้อความไปยังระบบซึ่งระบุความตั้งใจของคุณ เริ่มต้นคอมโพเนนต์ที่เฉพาะเจาะจง จากนั้น ระบบจะเปิดใช้งานคอมโพเนนต์ให้คุณ
เปิดใช้งานคอมโพเนนต์
ข้อความแบบไม่พร้อมกันที่เรียกว่า intent จะเปิดใช้งานคอมโพเนนต์ 3 จาก 4 ประเภท ได้แก่ กิจกรรม บริการ และ Broadcast Receiver Intent จะเชื่อมโยงคอมโพเนนต์แต่ละรายการเข้าด้วยกันขณะรันไทม์ ให้ลองคิดว่า กับโปรแกรมรับส่งข้อความที่ขอการดำเนินการจากคอมโพเนนต์อื่น ไม่ว่าคอมโพเนนต์นั้นจะเป็น กับแอปของคุณหรือที่อื่นๆ
Intent สร้างขึ้นด้วยออบเจ็กต์ Intent
ซึ่งกำหนดข้อความให้กับ
เปิดใช้งานคอมโพเนนต์ที่เฉพาะเจาะจง (Intent แบบโจ่งแจ้ง) หรือคอมโพเนนต์ประเภทใดประเภทหนึ่ง
(Intent แบบไม่เจาะจงปลายทาง)
สำหรับกิจกรรมและบริการ ความตั้งใจจะเป็นตัวกำหนดการกระทำ เช่น view หรือ ส่งบางอย่าง และอาจระบุ URI ของข้อมูลที่ต้องการดำเนินการ และอื่นๆ ที่พร็อพเพอร์ตี้ คอมโพเนนต์ที่เริ่มต้นอาจจำเป็นต้องรู้
ตัวอย่างเช่น Intent อาจสื่อถึงคำขอ
กิจกรรมเพื่อแสดงรูปภาพหรือเปิดหน้าเว็บ ในบางกรณี คุณสามารถเริ่ม
กิจกรรมเพื่อรับผลลัพธ์ ซึ่งในกรณีนี้กิจกรรมจะแสดงผลด้วย
ผลลัพธ์เป็น Intent
คุณยังแสดง Intent เพื่อให้
ผู้ใช้เลือกรายชื่อติดต่อส่วนตัว และขอให้ส่งกลับมาให้คุณ ความตั้งใจในการคืนสินค้าประกอบด้วย
URI ที่ชี้ไปยังรายชื่อติดต่อที่เลือก
สำหรับ Broadcast Receiver นั้น Intent จะเป็นตัวกำหนด ประกาศออกอากาศ เช่น การประกาศเพื่อแจ้งว่าแบตเตอรี่ของอุปกรณ์เหลือน้อย รวมเฉพาะสตริงการดำเนินการที่รู้จักซึ่งระบุว่าแบตเตอรี่เหลือน้อย
ผู้ให้บริการเนื้อหาแตกต่างจากกิจกรรม บริการ และผู้รับออกอากาศ
เปิดใช้งานเมื่อกำหนดเป้าหมายโดยคำขอจาก ContentResolver
เนื้อหา
รีโซลเวอร์จะจัดการธุรกรรมโดยตรงทั้งหมดกับผู้ให้บริการเนื้อหาและคอมโพเนนต์
ทำธุรกรรมกับผู้ให้บริการโทรวิธีใน
ออบเจ็กต์ ContentResolver
รายการ จึงทำให้เกิดกระบวนการแอบสแตรกต์อีกชั้นหนึ่งด้วยเหตุผลด้านความปลอดภัยระหว่าง
ผู้ให้บริการเนื้อหาและคอมโพเนนต์ที่ร้องขอข้อมูล
การเปิดใช้งานคอมโพเนนต์แต่ละประเภททำได้หลายวิธี ดังนี้
- คุณสามารถเริ่มกิจกรรมหรือให้สิ่งใหม่ๆ ทำได้โดยการ
กำลังส่ง
Intent
ไปยังstartActivity()
หรือเมื่อต้องการแสดง ผลการค้นหาstartActivityForResult()
- ใน Android 5.0 (API ระดับ 21) ขึ้นไป คุณสามารถใช้
ชั้นเรียน
JobScheduler
เพื่อตั้งเวลาการดำเนินการ สำหรับ Android เวอร์ชันก่อนหน้า คุณสามารถเริ่ม บริการหรือให้คำแนะนำใหม่แก่บริการที่กำลังดำเนินอยู่ได้โดย กำลังส่งIntent
ไปยังstartService()
คุณจะเชื่อมโยงกับบริการได้โดยการส่งIntent
ไปยังbindService()
- คุณจะเริ่มการออกอากาศได้โดยการส่ง
Intent
ไปยังเมธอดต่างๆ เช่นsendBroadcast()
หรือsendOrderedBroadcast()
- คุณสามารถสอบถามผู้ให้บริการเนื้อหาได้โดยโทรไปที่
query()
ในContentResolver
หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Intent โปรดดูส่วน Intent และ
เอกสารตัวกรอง Intent
เอกสารต่อไปนี้ให้ข้อมูลเพิ่มเติมเกี่ยวกับการเปิดใช้งานคอมโพเนนต์ที่เฉพาะเจาะจง
ข้อมูลเบื้องต้นเกี่ยวกับกิจกรรม,
ภาพรวมของบริการ,
BroadcastReceiver
และ
ผู้ให้บริการเนื้อหา
ไฟล์ Manifest
ก่อนที่ระบบ Android จะสามารถเริ่มต้นคอมโพเนนต์ของแอป ระบบต้องทราบว่า
มีอยู่โดยการอ่านไฟล์ Manifest ของแอป AndroidManifest.xml
แอปของคุณประกาศคอมโพเนนต์ทั้งหมดในไฟล์นี้ ซึ่งอยู่ที่รูทของ
ไดเรกทอรีโปรเจ็กต์แอป
ไฟล์ Manifest ทำหลายอย่างนอกเหนือจากการประกาศคอมโพเนนต์ของแอป เช่น
- ระบุสิทธิ์ของผู้ใช้ที่แอปต้องการ เช่น การเข้าถึงอินเทอร์เน็ตหรือ สิทธิ์การอ่านรายชื่อติดต่อของผู้ใช้
- ประกาศค่าต่ำสุด ระดับ API ซึ่งกำหนดโดยแอปโดยพิจารณาจาก API ที่แอปใช้
- ประกาศฟีเจอร์ของฮาร์ดแวร์และซอฟต์แวร์ที่แอปใช้หรือจำเป็นต้องใช้ เช่น กล้อง บริการบลูทูธหรือหน้าจอแบบมัลติทัช
- ประกาศไลบรารี API ที่แอปจำเป็นต้องลิงก์ด้วย (นอกเหนือจากเฟรมเวิร์ก Android API) เช่น ไลบรารี Google Maps
ประกาศคอมโพเนนต์
งานหลักของไฟล์ Manifest คือการแจ้งระบบเกี่ยวกับคอมโพเนนต์ของแอป สำหรับ เช่น ไฟล์ Manifest สามารถประกาศกิจกรรมดังนี้
<?xml version="1.0" encoding="utf-8"?> <manifest ... > <application android:icon="@drawable/app_icon.png" ... > <activity android:name="com.example.project.ExampleActivity" android:label="@string/example_label" ... > </activity> ... </application> </manifest>
ใน<application>
แอตทริบิวต์ android:icon
จะชี้ไปยังทรัพยากรสำหรับไอคอนที่ระบุ
แอป
ในองค์ประกอบ <activity>
แอตทริบิวต์ android:name
ระบุชื่อคลาสที่มีคุณสมบัติครบถ้วนของ
คลาสย่อย Activity
และ
แอตทริบิวต์ android:label
ระบุสตริง
เพื่อใช้เป็นป้ายกำกับที่ผู้ใช้มองเห็นได้สำหรับกิจกรรม
คุณต้องประกาศคอมโพเนนต์ของแอปทั้งหมดโดยใช้องค์ประกอบต่อไปนี้
- องค์ประกอบ
<activity>
สำหรับกิจกรรม <service>
องค์ประกอบสำหรับ บริการ- องค์ประกอบ
<receiver>
สำหรับ Broadcast Receiver - องค์ประกอบ
<provider>
สำหรับผู้ให้บริการเนื้อหา
กิจกรรม บริการ และผู้ให้บริการเนื้อหาที่คุณรวมไว้ในแหล่งที่มา แต่ไม่ได้ประกาศ
ในไฟล์ Manifest ไม่ปรากฏในระบบ ทำให้เรียกใช้ไม่ได้ อย่างไรก็ตาม
การบรอดแคสต์ข้อความ
ตัวรับสามารถประกาศในไฟล์ Manifest หรือสร้างขึ้นแบบไดนามิกในโค้ดเป็น
BroadcastReceiver
ออบเจ็กต์และลงทะเบียนกับระบบแล้วโดยการเรียกใช้
registerReceiver()
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดโครงสร้างไฟล์ Manifest ของแอปได้ที่ภาพรวมไฟล์ Manifest ของแอป
ประกาศความสามารถของคอมโพเนนต์
ดังที่อธิบายในส่วนเปิดใช้งานคอมโพเนนต์ คุณสามารถใช้
Intent
เพื่อเริ่มกิจกรรม บริการ และ Broadcast Receiver
คุณทำสิ่งนี้
ด้วยการตั้งชื่อคอมโพเนนต์เป้าหมายอย่างชัดเจน โดยใช้ชื่อคลาสคอมโพเนนต์ใน Intent
คุณยังสามารถใช้ Intent แบบไม่เจาะจงปลายทางซึ่ง
อธิบายประเภทของการดำเนินการที่ทำได้ และ (ไม่บังคับ) ข้อมูลที่คุณต้องการ
ดำเนินการในสิ่งนั้น Intent แบบไม่เจาะจงปลายทางช่วยให้ระบบค้นหาคอมโพเนนต์ในอุปกรณ์ได้
ซึ่งสามารถดำเนินการ
การดำเนินการและเริ่มใช้งาน หากมีคอมโพเนนต์หลายรายการที่สามารถดำเนินการตามที่อธิบายไว้โดยแท็ก
เพื่อให้ผู้ใช้เลือกว่าจะใช้ Intent ใด
ข้อควรระวัง: หากคุณใช้ Intent ในการเริ่ม
Service
โปรดตรวจสอบว่าแอปของคุณมีความปลอดภัยโดยใช้
โจ่งแจ้ง
Intent การใช้ Intent แบบไม่เจาะจงปลายทางเพื่อเริ่มบริการเป็น
อันตรายด้านความปลอดภัย เนื่องจากคุณจะไม่แน่ใจว่าบริการใดตอบสนองเจตนาของตน
และผู้ใช้ไม่สามารถเห็นได้ว่าบริการใดเริ่มทำงานบ้าง ใน Android 5.0 (API ระดับ 21) ระบบจะเลือกใช้
จะมีข้อยกเว้นหากคุณโทรหา bindService()
โดยมีเจตนาโดยนัย อย่าประกาศตัวกรอง Intent สำหรับบริการ
ระบบจะระบุองค์ประกอบที่สามารถตอบสนองต่อความตั้งใจได้ด้วยการเปรียบเทียบ Intent ที่ได้รับในตัวกรองความตั้งใจที่ให้ไว้ในไฟล์ Manifest ของแอปอื่นๆ อุปกรณ์
เมื่อประกาศกิจกรรมในไฟล์ Manifest ของแอป คุณเลือกที่จะรวม
ตัวกรอง Intent ที่ประกาศความสามารถของกิจกรรมเพื่อให้ตอบสนองต่อ Intent ได้
จากแอปอื่นๆ คุณดำเนินการนี้โดย
การเพิ่มเอลิเมนต์ <intent-filter>
เป็นองค์ประกอบย่อยขององค์ประกอบการประกาศของคอมโพเนนต์
เช่น หากสร้างแอปอีเมลที่มีกิจกรรมสำหรับเขียนอีเมลใหม่ คุณจะทำสิ่งต่อไปนี้ได้ ประกาศตัวกรอง Intent เพื่อตอบสนองต่อ "ส่ง" ต้องการส่งอีเมลใหม่ ดังที่ปรากฏในตัวอย่างต่อไปนี้
<manifest ... > ... <application ... > <activity android:name="com.example.project.ComposeEmailActivity"> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest>
หากแอปอื่นสร้าง Intent ด้วยการดำเนินการ ACTION_SEND
และส่งไปยัง
startActivity()
,
ระบบอาจเริ่มกิจกรรมของคุณเพื่อให้ผู้ใช้ร่างและส่ง
อีเมล
ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างตัวกรอง Intent ได้ในเอกสารตัวกรอง Intent และตัวกรอง Intent
ประกาศข้อกำหนดของแอป
อุปกรณ์ที่ขับเคลื่อนโดย Android นั้นมีหลายประเภท และมีเพียงบางรุ่นเท่านั้นที่มี ฟีเจอร์และความสามารถเดียวกัน วิธีป้องกันไม่ให้ติดตั้งแอปของคุณในอุปกรณ์ ซึ่งไม่มีฟีเจอร์ที่แอปจำเป็นต้องใช้ คุณจึงต้องกำหนดโปรไฟล์ให้ชัดเจน ประเภทอุปกรณ์ที่แอปของคุณรองรับด้วยการประกาศข้อกำหนดด้านอุปกรณ์และซอฟต์แวร์ใน Manifest
ประกาศเหล่านี้ส่วนใหญ่มีวัตถุประสงค์เพื่อให้ข้อมูลเท่านั้น ระบบไม่อ่าน แต่บริการภายนอก เช่น Google Play จะอ่านเนื้อหาเพื่อทำการกรอง สำหรับผู้ใช้เมื่อค้นหาแอปจากอุปกรณ์
ตัวอย่างเช่น สมมติว่าแอปของคุณต้องใช้กล้องและใช้ API ที่เปิดตัวใน Android 8.0 (API ระดับ 26)
คุณต้องประกาศข้อกำหนดเหล่านี้
ค่าสำหรับ minSdkVersion
และ targetSdkVersion
กำหนดไว้ใน
ไฟล์ build.gradle
ของโมดูลแอป
android { ... defaultConfig { ... minSdkVersion 26 targetSdkVersion 29 } }
หมายเหตุ: อย่าตั้งค่า minSdkVersion
และ
targetSdkVersion
โดยตรงในไฟล์ Manifest เนื่องจาก
จะถูกเขียนทับโดย Gradle ในระหว่างขั้นตอนการสร้าง สำหรับข้อมูลเพิ่มเติม โปรดดู
ระบุข้อกำหนดระดับ API
คุณประกาศฟีเจอร์กล้องถ่ายรูปในไฟล์ Manifest ของแอปดังนี้
<manifest ... > <uses-feature android:name="android.hardware.camera.any" android:required="true" /> ... </manifest>
จากประกาศที่แสดงในตัวอย่างเหล่านี้ อุปกรณ์ที่ไม่มี
หรือมีกล้อง
Android เวอร์ชันต่ำกว่า 8.0 จะติดตั้งแอปจาก Google Play ไม่ได้
อย่างไรก็ตาม คุณประกาศด้วยว่าแอปใช้กล้องได้
ข้อกำหนด โดยคุณต้องตั้งค่า required
แอตทริบิวต์เป็น false
ตรวจสอบขณะรันไทม์ว่า
อุปกรณ์มีกล้อง และปิดใช้ฟีเจอร์ต่างๆ ของกล้องตามต้องการ
ข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการความเข้ากันได้ของแอปกับอุปกรณ์ต่างๆ มีอยู่ในภาพรวมความเข้ากันได้ของอุปกรณ์
ทรัพยากรของแอป
แอป Android ไม่ได้มีเพียงโค้ดเท่านั้น จำเป็นต้องใช้ทรัพยากรที่ แยกจากซอร์สโค้ด เช่น รูปภาพ ไฟล์เสียง และไฟล์อื่นๆ ที่เกี่ยวข้องกับภาพ การนำเสนอแอป เช่น คุณสามารถกำหนดภาพเคลื่อนไหว เมนู รูปแบบ สี และเลย์เอาต์อินเทอร์เฟซผู้ใช้ของกิจกรรมด้วยไฟล์ XML
การใช้ทรัพยากรของแอปช่วยให้ง่าย เพื่ออัปเดตลักษณะเฉพาะต่างๆ ของแอปโดยไม่ต้องแก้ไขโค้ด การระบุ ชุดของทรัพยากรทางเลือกที่ช่วยให้คุณสามารถเพิ่มประสิทธิภาพแอปของคุณสำหรับ การกำหนดค่าอุปกรณ์ เช่น ภาษาและขนาดหน้าจอที่แตกต่างกัน
สำหรับทรัพยากรทั้งหมดที่รวมอยู่ในโปรเจ็กต์ Android เครื่องมือสร้าง SDK จะกำหนดองค์ประกอบ
รหัสจำนวนเต็ม ซึ่งคุณจะใช้เพื่ออ้างอิงทรัพยากรจากโค้ดของแอปหรือจาก
ทรัพยากรอื่นๆ ที่กำหนดไว้ใน XML ตัวอย่างเช่น หากแอปของคุณมีไฟล์ภาพชื่อ
logo.png
(บันทึกในไดเรกทอรี res/drawable/
) เครื่องมือ SDK จะสร้าง
รหัสทรัพยากรชื่อ R.drawable.logo
รหัสนี้จะจับคู่กับจำนวนเต็มเฉพาะแอป
คุณสามารถใช้เพื่ออ้างอิงรูปภาพและแทรกรูปภาพนั้นในอินเทอร์เฟซผู้ใช้ของคุณ
สิ่งสำคัญที่สุดอย่างหนึ่งของการให้ทรัพยากรแยกจากซอร์สโค้ด คือความสามารถในการให้ทรัพยากรอื่นสำหรับอุปกรณ์ต่างๆ การกำหนดค่าเอง
ตัวอย่างเช่น การกำหนดสตริง UI ใน XML คุณสามารถแปลค่า
สตริงให้เป็นส่วนอื่นๆ
ภาษา และบันทึกสตริงเหล่านั้นในไฟล์แยกต่างหาก จากนั้น Android จะใช้
สตริงภาษาที่เหมาะสม
ลงใน UI โดยอิงตามตัวระบุภาษา
ที่คุณเพิ่มต่อท้ายชื่อไดเรกทอรีทรัพยากร เช่น res/values-fr/
สำหรับสตริงภาษาฝรั่งเศส
และการตั้งค่าภาษาของผู้ใช้
Android รองรับตัวระบุจำนวนมากสำหรับทรัพยากรทางเลือกของคุณ qualifier คือสตริงสั้นๆ ที่คุณใส่ไว้ในชื่อไดเรกทอรีทรัพยากรเพื่อ กำหนดค่าอุปกรณ์ที่จะใช้ทรัพยากรเหล่านั้น
สำหรับ เช่น คุณสามารถสร้างเลย์เอาต์ที่แตกต่างกันสําหรับกิจกรรม โดยขึ้นอยู่กับ การวางแนวและขนาดหน้าจอของอุปกรณ์ เมื่อหน้าจออุปกรณ์อยู่ในแนวตั้ง (สูง) การวางแนว คุณอาจต้องการการจัดวางที่มีปุ่มอยู่ในแนวตั้ง แต่เมื่อหน้าจออยู่ใน ในแนวนอน (กว้าง) คุณอาจต้องการให้ปุ่มอยู่ในแนวแนวนอน วิธีเปลี่ยนเลย์เอาต์ คุณสามารถกำหนดรูปแบบได้ 2 รูปแบบ และนำรูปแบบที่เหมาะสม ของชื่อไดเรกทอรีของเลย์เอาต์แต่ละรายการ จากนั้น ระบบจะเลือกใช้ เลย์เอาต์ที่ขึ้นอยู่กับการวางแนวของอุปกรณ์ในปัจจุบัน
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับทรัพยากรประเภทต่างๆ ที่คุณสามารถรวมไว้ในแอปพลิเคชันได้ และวิธีการ สร้างทรัพยากรทางเลือกสำหรับการกำหนดค่าอุปกรณ์ที่แตกต่างกัน โปรดอ่านภาพรวมทรัพยากรของแอป ถึง ศึกษาแนวทางปฏิบัติที่ดีที่สุดและการออกแบบแอปที่มีประสิทธิภาพและมีคุณภาพการผลิต โปรดดูคู่มือสถาปัตยกรรมแอป
แหล่งข้อมูลเพิ่มเติม
หากต้องการเรียนรู้การพัฒนาแอป Android โดยใช้วิดีโอและบทแนะนำโค้ด โปรดดูที่ การพัฒนาแอป Android ด้วย Kotlin หลักสูตร Udacity
อ่านต่อเกี่ยวกับ:
- ตัวกรอง Intent และ Intent
- ดูวิธีใช้
Intent
API เพื่อ เปิดใช้งานคอมโพเนนต์ของแอป เช่น กิจกรรมและบริการ และวิธีทำให้คอมโพเนนต์ของแอป สามารถใช้งานกับแอปอื่นๆ ได้ - ข้อมูลเบื้องต้นเกี่ยวกับกิจกรรม
- ดูวิธีสร้างอินสแตนซ์ของชั้นเรียน
Activity
ซึ่งจะแสดงหน้าจอแยกในแอปพลิเคชันพร้อมกับอินเทอร์เฟซผู้ใช้ - ภาพรวมแหล่งข้อมูลของแอป
- ดูว่าแอป Android มีโครงสร้างอย่างไรในการแยกทรัพยากรของแอปออกจาก โค้ดของแอป รวมถึงวิธีการระบุทรัพยากรอื่นสำหรับอุปกรณ์แต่ละรุ่น การกำหนดค่าเอง
หนังสือที่สนใจ:
- ภาพรวมความเข้ากันได้ของอุปกรณ์
- ดูวิธีการทำงานของ Android ในอุปกรณ์ประเภทต่างๆ และ วิธีเพิ่มประสิทธิภาพแอปสำหรับอุปกรณ์แต่ละเครื่องหรือจำกัดความพร้อมให้บริการของแอป ไปยังอุปกรณ์อื่นๆ
- สิทธิ์ใน Android
- ดูวิธีที่ Android จำกัดสิทธิ์ของแอปในการเข้าถึง API บางรายการ ระบบที่ต้องได้รับความยินยอมจากผู้ใช้เพื่อให้แอปของคุณใช้ API ดังกล่าวได้