API ของ Android 4.2

ระดับ API: 17

Android 4.2 (JELLY_BEAN_MR1) คือการอัปเดตรุ่น Jelly Bean ที่นำเสนอฟีเจอร์ใหม่ๆ สำหรับผู้ใช้และแอป เอกสารนี้จะให้ข้อมูลเบื้องต้นเกี่ยวกับ API ใหม่ๆ ที่เป็นประโยชน์สำหรับนักพัฒนาซอฟต์แวร์

ในฐานะนักพัฒนาแอป คุณควรดาวน์โหลดอิมเมจระบบและแพลตฟอร์ม SDK ของ Android 4.2 จาก SDK Manager โดยเร็วที่สุด หากคุณ ไม่มีอุปกรณ์ที่ใช้ Android 4.2 ที่จะทดสอบแอปของคุณ โปรดใช้ระบบ Android 4.2 รูปภาพเพื่อทดสอบแอปในโปรแกรมจำลอง Android จากนั้นสร้างแอปบนแพลตฟอร์ม Android 4.2 เพื่อเริ่มใช้ API ล่าสุด

หากต้องการเพิ่มประสิทธิภาพแอปสำหรับอุปกรณ์ที่ใช้ Android 4.2 ได้ดียิ่งขึ้น คุณควรตั้งค่า targetSdkVersion เป็น "17" ให้ติดตั้งในอิมเมจระบบ Android 4.2 แล้วเผยแพร่อัปเดตที่มีการเปลี่ยนแปลงนี้

คุณ สามารถใช้ API ใน Android 4.2 ในขณะเดียวกันก็รองรับเวอร์ชันเก่าด้วยการเพิ่ม เงื่อนไขในโค้ดของคุณที่ตรวจสอบระดับ API ของระบบก่อนดำเนินการ API ไม่รองรับใน minSdkVersion หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ การรักษาความเข้ากันได้แบบย้อนหลัง โปรดอ่าน การสร้างความเข้ากันได้แบบย้อนหลัง UI

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของระดับ API ได้ใน API คืออะไร ระดับ

การเปลี่ยนแปลงลักษณะการทำงานที่สำคัญ

หากคุณเคยเผยแพร่แอปสำหรับ Android มาแล้วก่อนหน้านี้ โปรดทราบข้อมูลต่อไปนี้ การเปลี่ยนแปลงที่อาจส่งผลกระทบต่อลักษณะการทำงานของแอป

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

    การเปลี่ยนแปลงนี้จะมีผลก็ต่อเมื่อคุณตั้งค่า android:targetSdkVersion หรือ android:minSdkVersion เป็น 17 ขึ้นไป หากไม่เป็นเช่นนั้น ค่าเริ่มต้นจะยังคงเป็น “true" แม้ในขณะที่ใช้งานบน Android 4.2 ขึ้นไป

  • ผลลัพธ์ของตำแหน่งของผู้ใช้อาจมีความแม่นยำน้อยลงเมื่อเทียบกับ Android เวอร์ชันก่อนหน้า หากแอปขอสิทธิ์ ACCESS_COARSE_LOCATION แต่ ไม่ได้ขอสิทธิ์ ACCESS_FINE_LOCATION

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

  • การตั้งค่าอุปกรณ์บางอย่างที่ Settings.System กำหนดไว้ตอนนี้ อ่านอย่างเดียว หากแอปพยายามเขียนการเปลี่ยนแปลงการตั้งค่าที่กำหนดไว้ใน Settings.System ซึ่งย้ายไปที่ Settings.Global แล้ว การเขียนจะล้มเหลวโดยไม่มีการแจ้งเตือนเมื่อทำงานใน Android 4.2 ขึ้นไป

    แม้ว่าค่าสำหรับ android:targetSdkVersion และ android:minSdkVersion ของคุณจะต่ำกว่า 17 แต่แอปจะไม่สามารถแก้ไขการตั้งค่าที่มี ย้ายไปที่ Settings.Global ขณะใช้ Android 4.2 ขึ้นไป

  • ถ้าแอปของคุณใช้ WebView Android 4.2 จะเพิ่มชั้นของ การรักษาความปลอดภัย คุณจึงสามารถ เชื่อมโยง JavaScript กับ รหัส Android หากคุณตั้งค่า targetSdkVersion 17 ขึ้นไป ตอนนี้คุณต้องเพิ่มคำอธิบายประกอบ @JavascriptInterface ลงในวิธีการที่คุณต้องการ ต้องการให้กับ JavaScript ของคุณ (วิธีนี้ต้องเป็นแบบสาธารณะด้วย) หากคุณไม่ระบุ สำหรับหน้าเว็บใน WebView เข้าถึงเมธอดไม่ได้ เมื่อทำงานบน Android 4.2 ขึ้นไป หากคุณตั้งค่า targetSdkVersion เป็น 16 หรือต่ำกว่านั้น ก็ไม่จำเป็นต้องใช้คำอธิบายประกอบ แต่เราขอแนะนำให้คุณอัปเดตเวอร์ชันเป้าหมาย และเพิ่มคำอธิบายประกอบเพื่อเพิ่มความปลอดภัย

    อ่านเพิ่มเติมเกี่ยวกับการเชื่อมโยง จากโค้ด JavaScript เป็นโค้ด Android

Daydream

Daydream คือโหมดภาพพักหน้าจอแบบอินเทอร์แอกทีฟแบบใหม่สำหรับอุปกรณ์ Android เปิดใช้งานโดยอัตโนมัติ เมื่อเสียบอุปกรณ์ลงในแท่นชาร์จหรือเมื่อไม่มีการใช้งานอุปกรณ์ขณะเสียบอยู่กับ ที่ชาร์จ (แทนที่จะปิดหน้าจอ) Daydream จะแสดงความฝันทีละ 1 รายการ ซึ่งอาจ เป็นจอแสดงผลแบบพาสซีฟทั้งหมด ซึ่งจะปิดเมื่อแตะ หรืออาจมีการโต้ตอบและตอบสนองตามอุปกรณ์ สำหรับกิจกรรมป้อนข้อมูลชุดเต็ม ความฝันของคุณจะทำงานในกระบวนการของแอปและมีสิทธิ์เข้าถึง ชุดเครื่องมือ Android UI ซึ่งรวมถึงมุมมอง เลย์เอาต์ และภาพเคลื่อนไหว เพื่อให้มีความยืดหยุ่นมากขึ้นและ มีประสิทธิภาพมากกว่าวอลเปเปอร์เคลื่อนไหว หรือวิดเจ็ตแอป

คุณสามารถสร้างฝันสำหรับ Daydream ได้โดยใช้คลาสย่อยของ DreamService API ของ DreamService คือ ออกแบบมาให้คล้ายกับของ Activity หากต้องการระบุ UI สำหรับ สามารถส่งผ่านรหัสทรัพยากรของเลย์เอาต์หรือ View ไปยัง setContentView() ได้ทุกเมื่อหลังจาก หน้าต่าง เช่น จาก onAttachedToWindow() Callback

คลาส DreamService มี Callback ที่สำคัญสำหรับวงจรอื่นๆ ทับ API Service พื้นฐาน เช่น onDreamingStarted(), onDreamingStopped() และ onDetachedFromWindow() คุณไม่สามารถเริ่มต้น DreamService จาก แอปจะทำงานโดยอัตโนมัติ

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

หากต้องการให้เดย์ดรีมพร้อมใช้งานในระบบ ให้ประกาศ DreamService ด้วยเอลิเมนต์ <service> ในไฟล์ Manifest จากนั้นคุณต้องรวมตัวกรอง Intent พร้อมกับการดำเนินการ "android.service.dreams.DreamService" เช่น

<service android:name=".MyDream" android:exported="true"
    android:icon="@drawable/dream_icon" android:label="@string/dream_label" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

ยังมีวิธีอื่นที่เป็นประโยชน์ใน DreamService ที่ควรทราบในเรื่องต่อไปนี้

  • setInteractive(boolean) จะควบคุมว่า ดรีมจะได้รับเหตุการณ์อินพุตหรือออกทันทีที่ผู้ใช้ป้อน หากฝันคือ แบบอินเทอร์แอกทีฟ ผู้ใช้สามารถใช้ปุ่มกลับหรือหน้าแรก เพื่อออกจากความฝันหรือเรียกใช้ finish()เพื่อหยุดความฝัน
  • หากต้องการแสดงผลที่สมจริงแบบเต็มตา ให้โทรหา setFullscreen() เพื่อซ่อนแถบสถานะ
  • ก่อนที่เดย์ดรีมจะเริ่มต้นขึ้น จอแสดงผลจะหรี่แสงลงเพื่อส่งสัญญาณให้ผู้ใช้ทราบว่าการหมดเวลาเมื่อไม่มีการใช้งาน ใกล้เข้ามาแล้ว การโทรหา setScreenBright(true) จะทำให้คุณตั้งค่าจอแสดงผลที่ความสว่างปกติแทนได้

ดูข้อมูลเพิ่มเติมได้ในเอกสาร DreamService

จอแสดงผลสำรอง

ตอนนี้ Android อนุญาตให้แอปของคุณแสดงเนื้อหาที่ไม่ซ้ำกันในหน้าจออื่นๆ ที่เชื่อมต่อแล้ว กับอุปกรณ์ของผู้ใช้ผ่านการเชื่อมต่อแบบใช้สายหรือ Wi-Fi หากต้องการสร้างเนื้อหาที่ไม่ซ้ำกันสำหรับจอแสดงผลรอง ให้ขยาย Presentation และใช้ Callback onCreate() ภายใน onCreate() ระบุ UI สำหรับจอแสดงผลรอง โดยโทรไปที่ setContentView() คลาส Presentation เป็นส่วนขยายของคลาส Dialog ที่ให้ภูมิภาคที่แอปของคุณสามารถแสดง UI ที่ไม่ซ้ำกันบน จอแสดงผลรอง

หากต้องการตรวจหาจอแสดงผลสำรองที่คุณแสดงPresentationได้ ใช้ DisplayManager หรือ MediaRouter API แม้ว่า API ของ DisplayManager จะช่วยให้คุณแจกแจง จอแสดงผลหลายจอที่อาจเชื่อมต่อพร้อมกัน โดยทั่วไปคุณควรใช้ MediaRouter แทนเพื่อเข้าถึงการแสดงผลเริ่มต้นของระบบอย่างรวดเร็วสำหรับ งานนำเสนอ

หากต้องการใช้การแสดงผลเริ่มต้นสำหรับงานนำเสนอ ให้โทรหา MediaRouter.getSelectedRoute() เพื่อส่งต่อให้ ROUTE_TYPE_LIVE_VIDEO จะแสดงผลออบเจ็กต์ MediaRouter.RouteInfo ซึ่งอธิบายเส้นทางที่เลือกในปัจจุบันของระบบ สำหรับงานนำเสนอทางวิดีโอ หาก MediaRouter.RouteInfo ไม่เป็นค่าว่าง โปรดเรียก getPresentationDisplay() เพื่อให้ได้ Display ที่แสดงถึงจอแสดงผลที่เชื่อมต่อ

จากนั้นคุณจะแสดงงานนำเสนอได้โดยส่งออบเจ็กต์ Display ให้กับเครื่องมือสร้างสำหรับชั้นเรียน Presentation ตอนนี้งานนำเสนอของคุณจะ จะปรากฏขึ้นบนจอแสดงผลรอง

หากต้องการตรวจหาขณะรันไทม์เมื่อมีการเชื่อมต่อจอแสดงผลใหม่ ให้สร้างอินสแตนซ์ของ MediaRouter.SimpleCallback ที่คุณใช้เมธอด Callback onRoutePresentationDisplayChanged() ซึ่งระบบจะเรียกเมื่อมี เชื่อมต่อจอแสดงผลของงานนำเสนอแล้ว จากนั้นลงทะเบียน MediaRouter.SimpleCallback โดยส่งต่อไปยัง MediaRouter.addCallback() พร้อมด้วยประเภทเส้นทาง ROUTE_TYPE_LIVE_VIDEO เมื่อคุณรับสายที่ onRoutePresentationDisplayChanged() โปรดโทรหา MediaRouter.getSelectedRoute() ดังที่กล่าวไว้ข้างต้น

หากต้องการเพิ่มประสิทธิภาพ UI ใน Presentation สำหรับ คุณสามารถใช้หน้าจอรอง ธีมอื่นโดยระบุแอตทริบิวต์ android:presentationTheme ใน <style> ใช้กับแอปพลิเคชันหรือกิจกรรมของคุณ

โปรดทราบว่าหน้าจอที่เชื่อมต่อกับอุปกรณ์ของผู้ใช้มักจะมีหน้าจอขนาดใหญ่และ ความหนาแน่นของหน้าจอที่เปลี่ยนไป เนื่องจากลักษณะของหน้าจออาจแตกต่างกัน คุณจึงควร มอบทรัพยากรที่ปรับแต่งมาโดยเฉพาะสำหรับจอแสดงผลขนาดใหญ่ หากต้องการ หากต้องการขอทรัพยากรเพิ่มเติมจาก Presentation ให้เรียก getContext().getResources() เพื่อรับออบเจ็กต์ Resources ที่ตรงกับจอแสดงผล ซึ่งจะให้ ทรัพยากรที่เหมาะสมจากแอปของคุณซึ่งเหมาะกับ ขนาดและความหนาแน่นของหน้าจอที่ 2

ดูข้อมูลเพิ่มเติมและตัวอย่างโค้ดบางส่วนได้ที่ Presentation เอกสารของชั้นเรียน

วิดเจ็ตล็อกหน้าจอ

ขณะนี้ Android อนุญาตให้ผู้ใช้เพิ่มวิดเจ็ตแอปไปยังหน้าจอล็อก หากต้องการทำให้วิดเจ็ตแอปใช้งานได้ใน ในหน้าจอล็อก ให้เพิ่มแอตทริบิวต์ android:widgetCategory ลงในไฟล์ XML ที่ระบุ AppWidgetProviderInfo แอตทริบิวต์นี้รองรับ 2 ค่า ได้แก่ home_screen และ keyguard โดยค่าเริ่มต้น แอตทริบิวต์จะตั้งเป็น home_screen เพื่อให้ผู้ใช้สามารถเพิ่ม วิดเจ็ตของแอปบนหน้าจอหลัก หากคุณต้องการให้วิดเจ็ตแอปพร้อมใช้งานบนล็อกด้วย ให้บวกค่า keyguard

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:widgetCategory="keyguard|home_screen">
</appwidget-provider>

คุณควรระบุรูปแบบเริ่มต้นสำหรับวิดเจ็ตแอปเมื่ออยู่ในหน้าจอล็อกกับ แอตทริบิวต์ android:initialKeyguardLayout ซึ่งทำงานในลักษณะเดียวกับ android:initialLayout ที่มี เลย์เอาต์ที่จะปรากฏขึ้นได้ทันที จนกว่าวิดเจ็ตแอปของคุณจะเริ่มต้นทำงาน และอัปเดต เลย์เอาต์

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

ผู้ใช้หลายคน

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

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

การบันทึกข้อมูลในสภาพแวดล้อมที่มีผู้ใช้หลายคน

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

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

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

การระบุผู้ใช้ในสภาพแวดล้อมที่มีผู้ใช้หลายคน

หากแอปต้องการระบุผู้ใช้ที่ไม่ซ้ำ เช่น เพื่อรวบรวมข้อมูลวิเคราะห์หรือสร้างบัญชีอื่น คุณควรปฏิบัติตามแนวทางปฏิบัติที่แนะนำสำหรับการระบุ มีการติดตั้งที่ไม่ซ้ำกับที่อื่น โดยการสร้าง UUID ใหม่เมื่อแอปเริ่มทำงานสำหรับ ครั้งแรก คุณมั่นใจได้เลยว่าจะได้รับรหัสที่ไม่ซ้ำสำหรับการติดตามผู้ใช้แต่ละราย ไม่ว่าจะมีผู้ใช้ ผู้ใช้ที่ติดตั้งแอปของคุณ ในอุปกรณ์เครื่องเดียว หรือคุณจะบันทึกโทเค็นในเครื่องที่ดึงมาจาก เซิร์ฟเวอร์ของคุณหรือใช้รหัสการลงทะเบียนที่ Google Cloud Messaging ให้ไว้

โปรดระวังว่าหากแอปของคุณขอตัวระบุอุปกรณ์ฮาร์ดแวร์อย่างใดอย่างหนึ่ง (เช่น MAC ของ WiFi หรือหมายเลข SERIAL) พวกเขาจะระบุค่าเดียวกันสำหรับแต่ละรายการ เนื่องจากตัวระบุเหล่านี้เชื่อมโยงกับฮาร์ดแวร์ ไม่ใช่ตัวผู้ใช้ สิ่งที่ยังไม่กล่าวถึงอีกอย่างหนึ่ง ปัญหาที่ตัวระบุเหล่านี้ได้แนะนำ ดังที่อธิบายไว้ในหัวข้อ การระบุ บล็อกโพสต์เกี่ยวกับการติดตั้งแอป

การตั้งค่าส่วนกลางใหม่

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

การตั้งค่าที่มีอยู่หลายรายการถูกย้ายมาที่นี่จาก Settings.System หรือ Settings.Secure หากแอปของคุณคือ กำลังทำการเปลี่ยนแปลงการตั้งค่าที่เคยกำหนดไว้ใน Settings.System (เช่น AIRPLANE_MODE_ON) คุณควรคาดหวังว่า การทำเช่นนี้จะใช้ไม่ได้กับอุปกรณ์ที่ใช้ Android 4.2 หรือสูงกว่าหากการตั้งค่าเหล่านั้น ย้ายไปที่ Settings.Global คุณยังสามารถอ่านการตั้งค่าที่อยู่ใน Settings.Global แต่เนื่องจากการตั้งค่าดังกล่าวถือว่าปลอดภัยแล้ว ไม่ให้เปลี่ยนแปลง การพยายามดำเนินการจะล้มเหลวโดยไม่มีการแจ้งเตือน และระบบจะเขียนคำเตือนไปยัง บันทึกของระบบเมื่อเรียกใช้แอปใน Android 4.2 ขึ้นไป

การสนับสนุนเลย์เอาต์ RTL

ปัจจุบัน Android มี API มากมายที่จะช่วยให้คุณสร้างอินเทอร์เฟซผู้ใช้ได้อย่างราบรื่น เปลี่ยนการวางแนวของเลย์เอาต์เพื่อรองรับภาษาที่ใช้ UI แบบขวาไปซ้าย (RTL) และการอ่าน เช่น อาหรับและฮีบรู

หากต้องการเริ่มรองรับเลย์เอาต์ RTL ในแอป ให้ตั้งค่าแอตทริบิวต์ android:supportsRtl เป็นองค์ประกอบ <application> ในไฟล์ Manifest แล้วตั้งค่าเป็น “true" เมื่อคุณเปิดใช้แล้ว ระบบจะเปิดใช้ RTL API ต่างๆ เพื่อ แสดงแอปของคุณด้วยรูปแบบ RTL ตัวอย่างเช่น แถบการดำเนินการจะแสดงไอคอนและชื่อ ด้านขวาและปุ่มดำเนินการทางด้านซ้าย และเลย์เอาต์ที่คุณสร้างขึ้นด้วย ระบบจะกลับคลาส View ที่ได้จากเฟรมเวิร์กด้วย

หากคุณต้องการเพิ่มประสิทธิภาพลักษณะที่ปรากฏของแอปเพิ่มเติมเมื่อแสดงด้วยเลย์เอาต์ RTL การเพิ่มประสิทธิภาพพื้นฐานมีอยู่ 2 ระดับดังนี้

  1. แปลงคุณสมบัติการจัดวางทางซ้ายและขวาเป็นการออกแบบต้นทางและปลายทาง พร็อพเพอร์ตี้

    เช่น ใช้ android:layout_marginStart แทน android:layout_marginLeft และ android:layout_marginEnd แทน android:layout_marginRight

    คลาส RelativeLayout ยังมีเลย์เอาต์ที่สอดคล้องกัน เพื่อแทนที่ตำแหน่งซ้าย/ขวา เช่น android:layout_alignParentStart เป็น แทนที่ android:layout_alignParentLeft และ android:layout_toStartOf แทน android:layout_toLeftOf

  2. หรือเพื่อให้ได้การเพิ่มประสิทธิภาพที่สมบูรณ์สำหรับรูปแบบ RTL คุณสามารถจัดเตรียมเนื้อหาแยกต่างหากทั้งหมด ไฟล์เลย์เอาต์ที่ใช้ตัวระบุทรัพยากร ldrtl (ldrtl ย่อมาจาก Layout-direction-right-to-left}) ตัวอย่างเช่น คุณสามารถบันทึกไฟล์เลย์เอาต์เริ่มต้นใน res/layout/ และเลย์เอาต์ที่เพิ่มประสิทธิภาพ RTL ใน res/layout-ldrtl/

    ตัวระบุ ldrtl เหมาะอย่างยิ่งสำหรับทรัพยากรที่ถอนออกได้เพื่อให้ ภาพกราฟิกที่มุ่งหน้าไปในทิศทางที่สอดคล้องกับทิศทางการอ่าน

API อื่นๆ อีกหลายรายการจะพร้อมใช้งานในเฟรมเวิร์กเพื่อรองรับรูปแบบ RTL เช่น คลาส View เพื่อให้คุณใช้ลักษณะการทำงานที่เหมาะสมสำหรับ และใน Configuration เพื่อค้นหาทิศทางของเลย์เอาต์ปัจจุบัน

หมายเหตุ: หากคุณใช้ SQlite และมีชื่อตารางหรือคอลัมน์ที่ "ตัวเลขเท่านั้น" เป็น โปรดระวัง: การใช้ String.format(String, Object...) อาจทำให้เกิดข้อผิดพลาดที่ทำให้ตัวเลข ถูกแปลงเป็นภาษาอาหรับ หากอุปกรณ์ของคุณตั้งค่าเป็นภาษาอาหรับ คุณต้องใช้ String.format(Locale,String,Object...) เพื่อให้แน่ใจว่าหมายเลข เป็น ASCII และใช้ String.format("%d", int) แทนการใช้ String.valueOf(int) สำหรับ การจัดรูปแบบตัวเลข

ส่วนย่อยที่ซ้อนกัน

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

หากต้องการซ้อน Fragment เพียงเรียกใช้ getChildFragmentManager() ใน Fragment ที่ต้องการเพิ่มส่วนย่อย การดำเนินการนี้จะแสดงผล FragmentManager ที่คุณใช้ได้ตามปกติจากกิจกรรมระดับบนสุด เพื่อสร้างธุรกรรมส่วนย่อย ลองดูตัวอย่างโค้ดที่เพิ่มส่วนย่อยจากในด้านล่างนี้ ชั้นเรียน Fragment ที่มีอยู่แล้ว

Kotlin

val videoFragment = VideoPlayerFragment()
childFragmentManager.beginTransaction().apply {
    add(R.id.video_fragment, videoFragment)
    commit()
}

Java

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

จากภายในส่วนย่อยที่ฝังอยู่ คุณสามารถรับการอ้างอิงไปยังส่วนย่อยระดับบนสุดได้ด้วยการเรียก getParentFragment()

ขณะนี้ Android Support Library รองรับ Fragment ที่ซ้อนกันและคุณจะใช้ฟีเจอร์ที่ซ้อนกันได้ การออกแบบ Fragment ใน Android 1.6 ขึ้นไป

หมายเหตุ: คุณจะเพิ่มเลย์เอาต์เป็นส่วนย่อยไม่ได้เมื่อเลย์เอาต์นั้น มี <fragment> ระบบจะรองรับ Fragment ที่ซ้อนกันเมื่อเพิ่มลงในไฟล์ แบบไดนามิก

Renderscript

ฟังก์ชันการคำนวณ Renderscript ได้รับการปรับปรุงให้ดีขึ้นด้วยฟีเจอร์ต่อไปนี้

ลักษณะเฉพาะของสคริปต์

คุณสามารถใช้ลักษณะเฉพาะของสคริปต์ในตัวของ Renderscript ในการดำเนินการ การดำเนินการทั่วไปให้คุณ เช่น

หากต้องการใช้สคริปต์ภายใน ให้เรียกเมธอด create() แบบคงที่ของแต่ละ instrinsic เพื่อสร้างอินสแตนซ์ของสคริปต์ จากนั้นโทรหา set() ที่ว่างอยู่ ของแต่ละสคริปต์ภายใน การตั้งค่าอินพุตและตัวเลือกที่จำเป็น สุดท้าย โทรหา forEach() เพื่อเรียกใช้สคริปต์

กลุ่มสคริปต์

ScriptGroup ช่วยให้คุณเชื่อมโยง Renderscript ที่เกี่ยวข้องเข้าด้วยกันได้ สคริปต์ และเรียกใช้ด้วยการเรียกครั้งเดียว

ใช้ ScriptGroup.Builder เพื่อเพิ่มสคริปต์ทั้งหมดไปยังกลุ่ม โดยโทรไปที่ addKernel() เมื่อคุณ เพิ่มสคริปต์ทั้งหมด สร้างการเชื่อมต่อระหว่าง สคริปต์ด้วยการเรียก addConnection() เมื่อเพิ่มการเชื่อมต่อเสร็จแล้ว ให้โทรหา create() เพื่อสร้างกลุ่มสคริปต์ โปรดระบุอินพุตก่อนเรียกใช้กลุ่มสคริปต์ Allocation และสคริปต์เริ่มต้นที่จะทำงานด้วย setInput(Script.KernelID, Allocation) และระบุเอาต์พุต Allocation ที่จะถูกเขียนผลลัพธ์และสคริปต์สุดท้ายถึง รันกับ setOutput() สุดท้าย ให้เรียก execute() เพื่อเรียกใช้กลุ่มสคริปต์

สคริปต์ตัวกรอง

filterscript กำหนดข้อจำกัดสำหรับ Renderscript API ที่มีอยู่ที่อนุญาตให้เรียกใช้โค้ดที่เป็นผลลัพธ์ บนหน่วยประมวลผล (CPU, GPU และ DSP) ที่หลากหลายมากขึ้น หากต้องการสร้างไฟล์ filterscript ให้สร้าง .fs แทนที่จะเป็น .rs ไฟล์ และระบุ #pragma rs_fp_relaxed เป็น บอกรันไทม์ของ Renderscript สคริปต์ของสคริปต์ไม่จำเป็นต้องมีความถูกต้องแม่นยำของจุดลอยตัว IEEE 754-2008 ที่เข้มงวด ความแม่นยํานี้ช่วยให้มีระยะเท่ากันถึง 0 สำหรับส่วนที่เป็นเส้นฟันปลอมและแบบกลมเป็นศูนย์ นอกจากนี้Filterscript สคริปต์ต้องไม่ใช้ประเภทในตัวแบบ 32 บิต และต้องระบุฟังก์ชันรากที่กำหนดเองโดยใช้ฟังก์ชัน __attribute__((kernel)) เนื่องจากFilterscript ไม่รองรับตัวชี้ ซึ่ง ลายเซ็นเริ่มต้นของฟังก์ชัน root() จะกำหนด

หมายเหตุ: แม้ว่าจะมีการรองรับ filterscript อยู่ในแพลตฟอร์ม แต่นักพัฒนาซอฟต์แวร์ การสนับสนุนจะพร้อมใช้งานในเครื่องมือ SDK รุ่น 21.0.1

สำหรับมุมมองโดยละเอียดของการเปลี่ยนแปลง API ทั้งหมดใน Android 4.2 โปรดดูที่ รายงานความแตกต่างของ API