ระดับ 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 ที่เหมาะสม
- สำหรับการเข้าถึงที่จัดเก็บข้อมูลภายใน ให้ใช้
getFilesDir()
,getCacheDir()
หรือopenFileOutput()
- สำหรับการเข้าถึงที่จัดเก็บข้อมูลภายนอก ให้ใช้
getExternalFilesDir()
หรือgetExternalStoragePublicDirectory()
ไม่ว่าคุณจะใช้ 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 ระดับดังนี้
- แปลงคุณสมบัติการจัดวางทางซ้ายและขวาเป็นการออกแบบต้นทางและปลายทาง
พร็อพเพอร์ตี้
เช่น ใช้
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
- หรือเพื่อให้ได้การเพิ่มประสิทธิภาพที่สมบูรณ์สำหรับรูปแบบ 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 ในการดำเนินการ การดำเนินการทั่วไปให้คุณ เช่น
Blends
Blur
Color matrix
3x3 convolve
5x5 convolve
Per-channel lookup table
Converting an Android YUV buffer to RGB
หากต้องการใช้สคริปต์ภายใน ให้เรียกเมธอด
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