โหมดหลายหน้าต่างแบบอิสระเป็นฟีเจอร์ที่มีการใช้งานน้อยและไม่ค่อยมีประโยชน์ใน Android Nougat เราอธิบายว่ามันคืออะไรและนักพัฒนาสามารถรวมมันเข้าด้วยกันได้อย่างไร
เมื่อ Android 7.0 Nougat เปิดตัวครั้งแรกเมื่อต้นปี 2559 ได้นำฟีเจอร์ที่เป็นที่ต้องการอย่างมากมาสู่แพลตฟอร์ม Android นั่นคือการรองรับหลายหน้าต่าง คนส่วนใหญ่ทราบถึงการรองรับหลายหน้าต่างแบบแยกหน้าจอที่เปิดใช้งานโดยค่าเริ่มต้นในโทรศัพท์และแท็บเล็ต Android Nougat ทั้งหมด อุปกรณ์ Android TV ที่ใช้ Android Nougat มาพร้อมกับการรองรับการรองรับหลายหน้าต่างแบบภาพซ้อนภาพ
อย่างไรก็ตาม มีโหมดหลายหน้าต่างโหมดที่สามใน Android Nougat ซึ่งมีคนไม่มากนักที่ทราบ: โหมดหน้าต่างรูปแบบอิสระ. โหมดนี้อนุญาตให้ Android นำเสนอแอปเป็นหน้าต่างลอยที่ผู้ใช้สามารถย้ายและปรับขนาดได้ตามต้องการ โดยพื้นฐานแล้วมันคือการใช้งาน a ตัวจัดการหน้าต่างแบบซ้อน.
ใน เอกสารประกอบ Android SDKมันระบุว่า:
ผู้ผลิตอุปกรณ์ขนาดใหญ่สามารถเลือกเปิดใช้งานโหมดอิสระ ซึ่งผู้ใช้สามารถปรับขนาดแต่ละกิจกรรมได้อย่างอิสระ หากผู้ผลิตเปิดใช้งานคุณสมบัตินี้ อุปกรณ์จะเสนอโหมดอิสระนอกเหนือจากโหมดแบ่งหน้าจอ
และยังใน ระบบปฏิบัติการ Android 7.0 ซีดี:
การใช้งานอุปกรณ์ที่มีขนาดหน้าจอ xlarge ควรรองรับโหมดอิสระ
สิ่งนี้บ่งชี้ว่าอุปกรณ์ Android หน้าจอขนาดใหญ่ใหม่ที่มาพร้อมกับ Android 7.0 อาจมีการเปิดใช้งานโหมดหน้าต่างรูปแบบอิสระโดยผู้ผลิต
อย่างไรก็ตาม นี่ไม่ใช่ข้อกำหนดที่ยากนัก ก็สามารถบังคับได้ ใดๆ อุปกรณ์ Android Nougat (พร้อมตัวเลือกสำหรับนักพัฒนา) เพื่อรองรับโหมดหน้าต่างรูปแบบอิสระโดยใช้หนึ่งในสองวิธีที่แตกต่างกัน:
การเปิดใช้งานโหมดหน้าต่างรูปแบบอิสระบนอุปกรณ์ Android Nougat ใด ๆ
วิธีที่ 1 (ต้องใช้คอมพิวเตอร์ที่มี adb)
ตรวจสอบให้แน่ใจว่าเปิดใช้งานการแก้ไขจุดบกพร่อง USB ในตัวเลือกนักพัฒนาแล้ว จากนั้นเชื่อมต่ออุปกรณ์ของคุณกับคอมพิวเตอร์ที่ติดตั้ง adb และดำเนินการคำสั่งต่อไปนี้:
adb shell settings put global enable_freeform_support 1
วิธีที่ 2 (ไม่มีข้อกำหนดเพิ่มเติม)
เปิดใช้งานตัวเลือก "บังคับให้ปรับขนาดกิจกรรมได้" ที่ด้านล่างของตัวเลือกนักพัฒนา
ทั้งสองวิธีนี้จำเป็นต้องรีสตาร์ท System UI ก่อนจึงจะมีผล วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการรีบูทอุปกรณ์ของคุณ (หรือหากอุปกรณ์ของคุณถูกรูทแล้ว คุณก็เพียงแค่ฆ่าไฟล์นั้นทิ้ง) com.android.systemui
กระบวนการ)
ตกลง ดังนั้นเปิดใช้งานโหมดรูปแบบอิสระ… แล้วไงล่ะ?
หากคุณเปิดใช้งานโหมดอิสระโดยใช้วิธีที่ 1 จะมีปุ่มใหม่บนรายการแอปในเมนูภาพรวมเพื่อเปิดแอปเข้าสู่โหมดหน้าต่างรูปแบบอิสระ
อย่างไรก็ตาม ด้วยวิธีที่ 2 คุณจะไม่สามารถเปิดแอปเข้าสู่โหมดอิสระผ่าน Android เองได้ โชคดี, เป็นไปได้ที่ตัวเรียกใช้งานบุคคลที่สามจะเปิดแอปในโหมดหน้าต่างรูปแบบอิสระ ใช้ Android API มาตรฐานที่ได้รับการสรุปโดยเป็นส่วนหนึ่งของ API ระดับ 24
กุญแจสำคัญในการเปิดแอปในโหมดอิสระคือการโทร ActivityOptions.setLaunchBounds()
วิธี. วิธีนี้ใช้เวลา Rect
เป็นอาร์กิวเมนต์ที่มีขอบเขตหน้าต่างที่แอปจะเปิดตัวด้วย
จากนั้นคุณสามารถเริ่มแอปด้วย startActivity(Intent, Bundle)
. หากคุณยังไม่มี ActivityOptions
คุณสามารถสร้างบันเดิลได้ ActivityOptions.makeBasic()
แล้วก็โทรมา setLaunchBounds()
บนชุดที่สร้างขึ้นใหม่
โปรดทราบว่าตามค่าเริ่มต้น หากมีงานสำหรับแอปอยู่ในหน้าจอภาพรวมอยู่แล้ว Android จะนำคุณไปยังงานที่มีอยู่ (เต็มหน้าจอ) ที่เปิดตัวก่อนหน้านี้โดย ผู้ใช้ คุณจะต้องล้างงานใดๆ สำหรับแอปในภาพรวมก่อนที่จะพยายามเปิดแอปในหน้าต่างรูปแบบอิสระ (สำหรับแอพที่มีกิจกรรมที่เปิดตัวมา standard
หรือ singleTop
โหมด คุณสามารถบังคับหน้าต่างใหม่ให้เปิดโดยการเพิ่ม Intent.FLAG_ACTIVITY_MULTIPLE_TASK
แจ้งเจตนาก่อนโทร startActivity()
.)
โหมดอิสระทำงานอย่างไรภายใต้ประทุน?
มี บทความที่ยอดเยี่ยม เขียนขึ้นเพื่ออธิบายวิธีการใช้โหมดหลายหน้าต่าง รวมถึงโหมดรูปแบบอิสระใน Android Nougat (หมายเหตุ: บทความนี้เขียนเป็นภาษาจีน ดังนั้นโปรดเรียกใช้ผ่าน Google Translate)
โดยสรุป แอปในโหมดอิสระจะทำงานในสแต็กแยกจากส่วนที่เหลือของระบบ (ลองนึกถึงเดสก์ท็อปเสมือน) ดังนั้นจึงเป็นไปไม่ได้ที่แอปรูปแบบอิสระจะทำงานบน Launcher หรือบนแอปแบบเต็มหน้าจออื่น
แอปที่ทำงานในโหมดอิสระ (ที่ไม่มี android: windowIsFloating
ตั้งเป็นจริง) มี DecorCaptionView
เพิ่มเป็นลูกของระดับบนสุด DecorView
. มุมมองนี้มีก LinearLayout
กำหนดแถบคำอธิบายของหน้าต่างเพื่อย้าย ขยายใหญ่สุด และปิดหน้าต่าง แม้ว่าฉันจะไม่แนะนำเป็นการส่วนตัว แต่ก็สามารถเข้าถึงและปรับแต่งมุมมองนี้ได้โดยการรับ DecorView
โดยใช้ Window.getDecorView()
, แคสต์ไปที่ a ViewGroup
จากนั้นจึงเข้าถึงมุมมองย่อย
แอปใดๆ ที่ได้รับการออกแบบมาให้ทำงานได้ดีในโหมดหลายหน้าต่างแบบแยกหน้าจอมาตรฐานของ Android จะทำงานในโหมดรูปแบบอิสระ isInMultiWindowMode()
จะกลับมาเป็นจริงสำหรับแอปที่ทำงานในโหมดอิสระ มีคลาสและวิธีการที่เปิดเผยต่อสาธารณะอื่นๆ สองสามวิธีที่แอปสามารถใช้ได้ซึ่งเกี่ยวข้องกับโหมดรูปแบบอิสระโดยเฉพาะ:
-
Window.setDecorCaptionShade()
: วิธีการนี้สามารถใช้เพื่อแทนที่เฉดสีของตัวควบคุมคำบรรยาย (ปุ่มขยายและปิด) สำหรับแอปในโหมดรูปแบบอิสระ -
Window.setRestrictedCaptionAreaListener()
: สามารถใช้เพื่อตรวจจับเมื่อมีการย้ายหน้าต่างในโหมดรูปแบบอิสระ ที่Window.OnRectrictedCaptionAreaChangedListener
ถูกเรียกทุกครั้งที่ตำแหน่งของตัวควบคุมคำอธิบายภาพเปลี่ยนไป (เมื่อผู้ใช้เลื่อนหน้าต่างไปรอบๆ) และระบุRect
ด้วยขอบเขตใหม่ของการควบคุมคำบรรยาย -
ActivityInfo.WindowLayout
: คลาสนี้มีข้อมูลที่ประกาศไว้ในไฟล์ Manifest ของแอปเกี่ยวกับตำแหน่งเริ่มต้นของหน้าต่างรูปแบบอิสระที่แอปสามารถขอได้เมื่อเปิดตัว ตัวอย่างเช่น คุณสามารถแสดงรายการต่อไปนี้ใน แท็กรายการของคุณ:
จากนั้นเมื่ออุปกรณ์อยู่ในโหมดอิสระและเปิดแอปแล้ว อุปกรณ์จะเปิดขึ้นตามขอบเขตที่ระบุเหล่านี้android: defaultHeight="640dp"
android: defaultWidth="360dp"
android: gravity="center" />
ตัวอย่างการทำงานของโหมดหน้าต่างรูปแบบอิสระ
ในฤดูร้อนปี 2559 ขณะที่ Android Nougat ยังคงเป็นรุ่นตัวอย่างสำหรับนักพัฒนาซอฟต์แวร์ ฉันได้เปิดตัวแอปชื่อ แถบงาน ที่มีเมนูเริ่มต้นเหมือน Windows และรายการแอพล่าสุดในการซ้อนทับของระบบ ช่วยให้ผู้ใช้บน Nougat สามารถเปิดแอปในโหมดหน้าต่างรูปแบบอิสระ และเนื่องจากแถบงานใช้การซ้อนทับ จึงสามารถอยู่บนหน้าจอในสภาพแวดล้อมของหน้าต่างรูปแบบอิสระได้ การผสมผสานระหว่างทาสก์บาร์และโหมดอิสระทำให้อุปกรณ์ Android โดยเฉพาะแท็บเล็ต มีความรู้สึกเหมือนพีซี
คุณสามารถ ดาวน์โหลดแถบงาน บน Google Play หรือ ดูซอร์สโค้ด ตัวคุณเองบน GitHub นอกเหนือจากแนวคิดที่กล่าวถึงในบทความนี้ ฉันยังใช้เทคนิคเล็กๆ น้อยๆ เพื่อทำให้สภาพแวดล้อมของโหมดอิสระยังคงใช้งานได้ แม้ว่าจะไม่มีหน้าต่างรูปแบบอิสระแสดงบนหน้าจอก็ตาม ผู้ใช้ยังสามารถเลือกที่จะตั้งค่าแถบงานเป็นตัวเรียกใช้งานเริ่มต้นเพื่อให้อุปกรณ์บู๊ตโดยอัตโนมัติสู่สภาพแวดล้อมโหมดอิสระ
เนื่องจากไม่มีอุปกรณ์ที่จัดส่งอย่างเป็นทางการพร้อมการรองรับหน้าต่างรูปแบบอิสระที่เปิดใช้งานโดย OEM (ณ วันที่เขียนนี้) ฉันขอแนะนำ การใช้แถบงานเป็นเครื่องมือสำหรับนักพัฒนาในการทดสอบแอปของตนในสภาพแวดล้อมหน้าต่างรูปแบบอิสระบนอุปกรณ์ที่ไม่รองรับ มัน.
นอกจากทาสก์บาร์แล้ว ฉันยังได้แก้ไขซอร์สโค้ด Launcher3 จาก AOSP เพื่ออนุญาตให้เปิดแอปในโหมดรูปแบบอิสระได้ นี่เป็นโคลนตรงของตัวเรียกใช้งาน Android 7.1.1 ในสต็อก โดยมีการปรับเปลี่ยนขั้นต่ำที่จำเป็นเพื่อให้สามารถเปิดแอปรูปแบบอิสระได้ ฉันได้จัดเตรียม Launcher ที่แก้ไขแล้วนี้โดยหวังว่านักพัฒนารายอื่นจะใช้การสนับสนุนสำหรับการเปิดตัวหน้าต่างรูปแบบอิสระใน Launcher แบบกำหนดเองของพวกเขา คุณสามารถ ดูซอร์สโค้ด บน GitHub หรือ ดาวน์โหลด APK ตัวอย่าง.
ความหวังของฉันคือนักพัฒนาของตัวเรียกใช้งานที่กำหนดเองสามารถใช้รหัสนี้และเปิดใช้งานการสนับสนุนสำหรับการเปิดตัวรูปแบบอิสระ แอพ window สำหรับผู้ใช้ที่ต้องการความยืดหยุ่นมากขึ้นในการจัดการหน้าต่างบนหน้าจอขนาดใหญ่ อุปกรณ์