ในแว่นตาที่มีระบบเสียง ระบบจะกำหนดเส้นทางการป้อนข้อมูลทางกายภาพ (เช่น ท่าทางสัมผัสของทัชแพดหรือการกดปุ่ม) ตามการรับรู้ของผู้ใช้แทนการโฟกัสการแสดงผลภาพ เนื่องจากผู้ใช้ไม่เห็นอินเทอร์เฟซผู้ใช้ ระบบจึงกำหนดเส้นทางการป้อนข้อมูลทางกายภาพไปยังกิจกรรมที่คาดการณ์ไว้ของประสบการณ์การใช้งานแอปที่ผู้ใช้กำลังรับรู้หรือโต้ตอบอยู่
วิธีที่ระบบพิจารณาการรับรู้ของผู้ใช้
ระบบจะพิจารณาการรับรู้ของผู้ใช้โดยตรวจสอบว่าสตรีมข้อมูลใดต่อไปนี้ทำงานอยู่
- สตรีมเอาต์พุตเสียง: การอ่านออกเสียง คิวเสียง หรือการเล่นสื่อ
- สตรีมการบันทึกเสียงจากไมโครโฟน: คำสั่งเสียงหรือการบันทึกเสียงที่ดำเนินอยู่จากสภาพแวดล้อมของผู้ใช้
- สตรีมการจับภาพจากกล้อง: สตรีมวิดีโอหรือรูปภาพ
สตรีมข้อมูลบางรายการเป็นแบบชั่วคราวและจะเก็บการรับรู้ของผู้ใช้ไว้เป็นระยะเวลาสั้นๆ เท่านั้น เช่น การอ่านออกเสียงการเลี้ยวถัดไปที่ผู้ใช้ควรเลี้ยวขณะนำทางในเส้นทาง สตรีมข้อมูลอื่นๆ จะไม่มีกำหนดและดึงดูดความสนใจของผู้ใช้ได้นานเท่าที่สตรีมยังคงดำเนินต่อไป เช่น การเล่นสื่อด้วยเพลย์ลิสต์แบบสุ่มที่ไม่มีที่สิ้นสุด เมื่อสตรีมข้อมูลชั่วคราวขัดจังหวะสตรีมข้อมูลแบบไม่จำกัด สตรีมข้อมูลชั่วคราวจะได้รับความสนใจจากผู้ใช้ชั่วคราว
การทำงานพร้อมกันและการโฟกัสอินพุต
ผู้ใช้มักจะเรียกใช้ประสบการณ์การใช้งานแอปหลายรายการพร้อมกันในแว่นตาที่มีระบบเสียง เช่น ผู้ใช้อาจฟังเพลงขณะใช้การนำทางแบบเลี้ยวต่อเลี้ยว ในกรณีเหล่านี้ ระบบจะกำหนดสถานะการทำงานพร้อมกันและเปลี่ยนโฟกัสอินพุตให้ตรงกับโฟกัสเสียงโดยทำสิ่งต่อไปนี้
- การกลับมาทำงานอีกครั้งหรือการหยุดกิจกรรมที่คาดการณ์ไว้ของแอป
- กำลังกำหนดเส้นทางอินพุตทางกายภาพไปยังกิจกรรมที่ฉายภาพในเบื้องหน้า
วิธีนี้จะช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่สอดคล้องกัน
ให้ระบบเปิดกิจกรรมที่คาดการณ์ไว้อีกครั้ง
เมื่อแอปของคุณได้รับความสนใจจากผู้ใช้ โดยเฉพาะอย่างยิ่งหากกิจกรรมที่คาดการณ์ไว้อยู่ในเบื้องหลัง ระบบต้องสามารถกลับมาทำกิจกรรมต่อและกำหนดเส้นทางอินพุตทางกายภาพไปยังกิจกรรมนั้นได้
วิธีตรวจสอบว่าระบบสามารถเปิดกิจกรรมอีกครั้งได้มีดังนี้
สร้าง Intent รอดำเนินการ: สร้าง
Intentที่ชัดเจนซึ่งชี้ไปยังกิจกรรมที่คาดการณ์เป้าหมาย รวม Intent ไว้ในPendingIntentและตั้งค่าFLAG_UPDATE_CURRENTหรือFLAG_IMMUTABLEเพื่อรักษาลักษณะการเปิดใช้งานที่ปลอดภัยและคาดการณ์ได้ ดังนี้// Build an explicit Intent pointing to this projected activity and wrap it in a // PendingIntent so the system can relaunch it and route physical input to it. private val pendingIntent: PendingIntent by lazy { val intent = Intent(this, ProjectedInputFocusActivity::class.java) PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) }
ลงทะเบียนตัวรับอินพุต: รับอินสแตนซ์ของ
ProjectedActivityCompatและลงทะเบียนPendingIntentเป็นตัวรับอินพุตที่กำหนดโดยส่งไปยังsetActivityAsInputReceiveroverride fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycleScope.launch { // Create or obtain the ProjectedActivityCompat instance val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity) // Register the PendingIntent as the designated input receiver projectedActivity.setActivityAsInputReceiver(pendingIntent) }
ล้างตัวรับอินพุตเมื่อล้างข้อมูล: เมื่อกิจกรรมถูกทำลายหรือไม่จำเป็นต้องรับอินพุตทางกายภาพอีกต่อไป ให้ล้างตัวรับอินพุตเพื่อป้องกันการส่ง
PendingIntentที่ล้าสมัยและหลีกเลี่ยงหน่วยความจำรั่วไหลoverride fun onDestroy() { super.onDestroy() lifecycleScope.launch { val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity) projectedActivity.clearActivityAsInputReceiver() } }
ทำความเข้าใจวิธีที่โฟกัสอินพุตเปลี่ยนไปตามสถานะการทำงานพร้อมกัน
ระบบจะประเมินสตรีมข้อมูลที่ใช้งานอยู่และกำหนดเส้นทางอินพุตตามสถานะการทำงานพร้อมกันต่อไปนี้เพื่อพิจารณาว่าแอปใดจะได้รับโฟกัสอินพุต
| สถานะการทำงานพร้อมกัน | บริบทด้านสิ่งแวดล้อม | ลักษณะการทำงานของระบบและโฟกัสการป้อนข้อมูล | ตัวอย่าง |
|---|---|---|---|
Non-concurrent |
กิจกรรมที่ฉายแบบสแตนด์อโลนทำงานอยู่ โดยไม่มีเซสชันสื่อที่ทำงานอยู่เบื้องหลัง |
ระบบจะกำหนดเส้นทางโฟกัสอินพุตไปยังกิจกรรมที่คาดการณ์ไว้ทั้งหมด แม้ในช่วงที่ไม่มีการอ่านออกเสียง |
ผู้ใช้เปิดแอปติดตามการออกกำลังกาย แม้ในช่วงที่ไม่มีเสียง อินพุตจากทัชแพดจะส่งไปยังแอปฟิตเนสโดยตรง |
กึ่งพร้อมกัน |
กิจกรรมที่ฉายอยู่ทำงานอยู่ แต่เซสชันสื่อในเบื้องหลังอยู่ในสถานะหยุดชั่วคราว |
โฟกัสอินพุตจะเปลี่ยนเป็นตัวควบคุมสื่อที่หยุดชั่วคราวโดยค่าเริ่มต้นในช่วงที่ไม่มีเสียงระหว่างการอ่านออกเสียงที่ทำงานอยู่ของแอป |
ผู้ใช้เปิดแอปติดตามการออกกำลังกายขณะที่เพลงหยุดชั่วคราว ในระหว่างการอัปเดตจากโค้ชฟิตเนส การแตะทัชแพดจะเล่นเพลงต่อแทนที่จะเรียกใช้ฟังก์ชันการออกกำลังกาย |
Concurrent |
การเล่นแบบคู่ทำงานอยู่ (เช่น เสียงประกาศของแอปขัดจังหวะหรือลดระดับเสียงเพลงที่เล่นอยู่เบื้องหลัง) |
โฟกัสเสียงเท่ากับโฟกัสอินพุต โฟกัสอินพุตจะกำหนดเส้นทางไปยังกิจกรรมที่ฉายภาพระหว่างการอ่านออกเสียงที่ทำงานอยู่ และจะเปลี่ยนกลับไปเป็นตัวควบคุมสื่อเมื่อสตรีมเสียงสิ้นสุดลง |
ผู้ใช้กำลังฟังเพลงเมื่อแอปการนำทางเริ่มอ่านคำแนะนำ ในระหว่างการอ่านออกเสียง แอปการนำทางจะได้รับโฟกัสอินพุต หลังจากอ่านออกเสียงเสร็จแล้ว โฟกัสการป้อนข้อมูลจะเปลี่ยนกลับไปที่ตัวควบคุมสื่อ |
การป้องกันเวลาของระบบ
ระบบมีมาตรการป้องกันต่อไปนี้เพื่อช่วยป้องกันการป้อนข้อมูลโดยไม่ตั้งใจหรือลักษณะการทำงานที่ไม่คาดคิดสำหรับผู้ใช้
- ระยะเวลาผ่อนผันสำหรับกิจกรรมที่ฉายซึ่งเพิ่งเปิดตัว: เพื่อรองรับการโหลดเนื้อหาแบบ Cold Start หรือความล่าช้าของเครือข่าย กิจกรรมที่ฉายซึ่งเพิ่งเปิดตัวจะได้รับระยะเวลาผ่อนผันสั้นๆ เพื่อสร้างสตรีมข้อมูลและสร้างการรับรู้ของผู้ใช้ก่อนที่ระบบจะหยุดกิจกรรมที่ฉายและย้ายไปทำงานในเบื้องหลัง
- ระบบจะกำหนดเส้นทางการโฟกัสตามการรับรู้ของผู้ใช้: หากการรับรู้ของผู้ใช้เปลี่ยนไปจากสตรีมข้อมูลใหม่ที่ใช้งานอยู่ เช่น การอ่านออกเสียง ระบบจะกลับมาทำกิจกรรมที่ฉายภาพไว้และกำหนดเส้นทางการโฟกัสอินพุตไปยังกิจกรรมนั้นทันที
- บัฟเฟอร์การเปลี่ยนระหว่างการเล่นสื่อ: เมื่อการอ่านข้อมูลชั่วคราวเสร็จสมบูรณ์ระหว่างการเล่นสื่อในเบื้องหลัง โฟกัสอินพุตจะยังคงอยู่ที่กิจกรรมที่ฉายอยู่ชั่วขณะหนึ่ง ระยะเวลาบัฟเฟอร์จะช่วยป้องกันการป้อนข้อมูลโดยไม่ตั้งใจ เช่น ผู้ใช้พยายามปิดเสียงการอ่านออกเสียง แต่กลับข้ามแทร็กเพลงแทน หลังจากบัฟเฟอร์การเปลี่ยนผ่าน ระบบจะหยุดกิจกรรมที่คาดการณ์ไว้ของแอปและกำหนดเส้นทางการโฟกัสอินพุตไปยังตัวควบคุมสื่อ
- กิจกรรมที่ฉายภาพซึ่งไม่มีการใช้งานจะหยุดหรือหยุดชั่วคราว: ระบบจะหยุดกิจกรรมที่ฉายภาพซึ่งไม่มีการใช้งานและไม่มีสตรีมข้อมูลที่ใช้งานอยู่หลังจากผ่านไป 2-3 นาที (หรือหยุดเอาต์พุตสื่อที่กำลังดำเนินอยู่ชั่วคราว)
การเปลี่ยนโฟกัสอินพุตในทางปฏิบัติ
หากต้องการทำความเข้าใจว่าโฟกัสอินพุตเปลี่ยนสถานะการทำงานพร้อมกันอย่างไร ให้พิจารณาสถานการณ์ตัวอย่างต่อไปนี้สำหรับแอปการนำทางที่ให้คำแนะนำแบบเลี้ยวต่อเลี้ยว
สถานการณ์ ก: ไม่พร้อมกัน (สื่อที่ไม่ได้ใช้งาน)
สำหรับสถานการณ์นี้ ระบบจะกำหนดเส้นทางอินพุตไปยังแอปการนำทาง ซึ่งจะรับรู้ถึงผู้ใช้ตลอดการเดินทาง
- ผู้ใช้เปิดการนำทางโดยไม่มีเพลงเล่นอยู่เบื้องหลัง
- แอปการนำทางจะเปิดกิจกรรมที่ฉายบนแว่นตาที่มีระบบเสียง
- เนื่องจากไม่มีเซสชันสื่อที่ใช้งานอยู่ แอปการนำทางจึงคงโฟกัสอินพุตทัชแพดไว้ตลอดการเดินทาง
- การดำเนินการของผู้ใช้: การแตะระหว่างการอ่านออกเสียงที่ทำงานอยู่อาจปิดเสียงคำแนะนำได้ การแตะระหว่างที่ไม่มีเสียงพูดอาจทำให้ระบบพูดคำสั่งล่าสุดซ้ำ
สถานการณ์ ข: การใช้งานแบบกึ่งพร้อมกัน (สื่อที่หยุดชั่วคราว)
สำหรับสถานการณ์นี้ ระบบจะกำหนดเส้นทางอินพุตไปยังตัวควบคุมสื่อของระบบเมื่อใดก็ตามที่แอปการนำทางไม่มีการรับรู้ของผู้ใช้
- ผู้ใช้เปิดการนำทางขณะที่เพลงที่เล่นอยู่เบื้องหลังหยุดชั่วคราว
- ในช่วงที่ไม่มีเสียงระหว่างการอ่านออกเสียง โฟกัสอินพุตจะเปลี่ยนไปที่ตัวควบคุมสื่อโดยค่าเริ่มต้น
- เมื่อแอปการนำทางพูดว่า "อีก 500 ฟุต เลี้ยวซ้าย" แอปจะได้รับโฟกัสอินพุต
- การดำเนินการของผู้ใช้: การแตะระหว่างการอ่านออกเสียงอาจปิดเสียงคำแนะนำ การแตะระหว่างที่ไม่มีเสียงจะทำให้เพลงกลับมาเล่นต่อ
สถานการณ์ ค: พร้อมกัน (สื่อที่ใช้งานอยู่)
สำหรับสถานการณ์นี้ ระบบจะกำหนดเส้นทางอินพุตไปยังตัวควบคุมสื่อของระบบเมื่อใดก็ตามที่แอปการนำทางไม่มีการรับรู้ของผู้ใช้ และเสียงจากการเล่นสื่อที่ใช้งานอยู่จะถูกลดระดับลงในระหว่างการอ่านแต่ละครั้งจากแอปการนำทาง
- ผู้ใช้เปิดการนำทางขณะที่เพลงกำลังเล่นอยู่
- ในระหว่างการอ่านคำแนะนำ ระบบจะลดเสียงพื้นหลังและเปลี่ยนโฟกัสอินพุตไปที่แอปการนำทาง
- การดำเนินการของผู้ใช้: การแตะระหว่างการอ่านออกเสียงอาจปิดเสียงคำแนะนำได้ การแตะในช่วงที่ไม่มีเสียงพูดจะเป็นการควบคุมการเล่นสื่อ (เพื่อหยุดชั่วคราวหรือเล่นต่อ)