Android 15 เปิดตัวฟีเจอร์และ API ที่ยอดเยี่ยมสำหรับนักพัฒนาแอป ส่วนต่อไปนี้จะสรุปฟีเจอร์เหล่านี้เพื่อช่วยให้คุณเริ่มต้นใช้งาน API ที่เกี่ยวข้องได้
ดูรายการ API ที่เพิ่ม แก้ไข และนําออกอย่างละเอียดได้ในรายงานความแตกต่างของ API ดูรายละเอียดเกี่ยวกับ API ที่เพิ่มได้ที่ข้อมูลอ้างอิง Android API สำหรับ Android 15 ให้มองหา API ที่เพิ่มใน API ระดับ 35 หากต้องการดูข้อมูลเกี่ยวกับด้านต่างๆ ที่การเปลี่ยนแปลงแพลตฟอร์มอาจส่งผลต่อแอปของคุณ โปรดดูการเปลี่ยนแปลงลักษณะการทํางานของ Android 15 สําหรับแอปที่กำหนดเป้าหมายเป็น Android 15 และสําหรับแอปทั้งหมด
กล้องและสื่อ
Android 15 มีฟีเจอร์มากมายที่ช่วยปรับปรุงประสบการณ์การใช้งานกล้องและสื่อ รวมถึงให้คุณเข้าถึงเครื่องมือและฮาร์ดแวร์เพื่อสนับสนุนครีเอเตอร์ในการสร้างสรรค์ผลงานใน Android
ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ล่าสุดและโซลูชันสำหรับนักพัฒนาแอปสำหรับสื่อและกล้องของ Android ได้ที่การบรรยายเรื่องการสร้างประสบการณ์การใช้งานสื่อและกล้อง Android ที่ทันสมัยจาก Google I/O
การเพิ่มแสงในสภาวะแสงน้อย
Android 15 引入了低光增强,这是一种新的自动曝光模式,可供 Camera 2 和夜间模式相机扩展使用。“低光增强”功能可调整预览视频流在弱光条件下的曝光量。这与夜间模式相机扩展程序创建静态图片的方式不同,因为夜间模式会组合多张照片来制作单张增强图片。虽然夜间模式非常适合创建静态图片,但无法创建连续的帧流,但“低光增强”可以。因此,“低光增强”可以实现新的相机功能,例如:
- 提供增强的图片预览,以便用户更好地为弱光环境取景
- 在光线昏暗的环境下扫描二维码
如果您启用“弱光增强”,它会在光线较暗时自动开启,在光线较暗时关闭。
应用可以在光线昏暗的环境下录制预览流,以保存明亮的视频。
有关详情,请参阅弱光增强。
การควบคุมกล้องในแอป
Android 15 adds an extension for more control over the camera hardware and its algorithms on supported devices:
- Advanced flash strength adjustments enabling precise control of flash
intensity in both
SINGLE
andTORCH
modes while capturing images.
การควบคุม Headroom ของ HDR
Android 15 会选择适合底层设备功能和面板的位深的 HDR 余量。对于包含大量 SDR 内容的页面(例如显示单个 HDR 缩略图的即时通讯应用),此行为最终可能会对 SDR 内容的感知亮度产生不利影响。Android 15 允许您使用 setDesiredHdrHeadroom
控制 HDR 余量,以在 SDR 和 HDR 内容之间取得平衡。
การควบคุมระดับเสียง
Android 15 เพิ่มการรองรับ มาตรฐานความดัง CTA-2075 เพื่อช่วยคุณ หลีกเลี่ยงความดังของเสียงที่ไม่สอดคล้องกัน และทำให้ผู้ใช้ไม่ต้องคอยฟัง ปรับระดับเสียงเมื่อสลับระหว่างเนื้อหา ระบบใช้ประโยชน์จากลักษณะที่ทราบของอุปกรณ์เอาต์พุต (หูฟังและลำโพง) พร้อมกับข้อมูลเมตาระดับเสียงที่มีอยู่ในเนื้อหาเสียง AAC เพื่อปรับระดับความดังของเสียงและการบีบอัดช่วงไดนามิกอย่างชาญฉลาด
หากต้องการเปิดใช้ฟีเจอร์นี้ คุณต้องตรวจสอบว่าข้อมูลเมตาระดับเสียงพร้อมใช้งานในเนื้อหา AAC และเปิดใช้ฟีเจอร์แพลตฟอร์มในแอป โดยคุณจะต้องสร้างอินสแตนซ์ออบเจ็กต์ LoudnessCodecController
ด้วยการเรียกใช้เมธอด create ของฟีเจอร์ดังกล่าวพร้อมด้วยรหัสเซสชันเสียงจาก AudioTrack
ที่เชื่อมโยง ซึ่งจะเริ่มใช้การอัปเดตเสียงโดยอัตโนมัติ คุณสามารถส่ง OnLoudnessCodecUpdateListener
เพื่อแก้ไขหรือกรองพารามิเตอร์ระดับเสียงก่อนที่จะนำไปใช้กับ MediaCodec
// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = …
val audioTrack = AudioTrack.Builder()
.setSessionId(sessionId)
.build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
val lcController = LoudnessCodecController.create(mSessionId)
// Starts applying audio updates for each added MediaCodec
}
นอกจากนี้ AndroidX media3 ExoPlayer จะได้รับการอัปเดตให้ใช้ LoudnessCodecController
API เพื่อการผสานรวมแอปอย่างราบรื่น
อุปกรณ์ MIDI 2.0 เสมือนจริง
Android 13 เพิ่มการรองรับสำหรับการเชื่อมต่อกับ อุปกรณ์ MIDI 2.0 ที่ใช้ USB ซึ่งสื่อสารโดยใช้ Universal MIDI Packets (UMP) Android 15 ขยายการรองรับ UMP เป็น MIDI เสมือน apps การทำให้แอปองค์ประกอบสามารถควบคุมแอปสังเคราะห์ เป็นอุปกรณ์ MIDI 2.0 เสมือนเหมือนที่ทำกับอุปกรณ์ USB MIDI 2.0
การถอดรหัสด้วยซอฟต์แวร์ AV1 ที่มีประสิทธิภาพมากขึ้น
dav1d(VideoLAN 中广受欢迎的 AV1 软件解码器)现已可用于在硬件中不支持 AV1 解码的 Android 设备。dav1d 的性能比旧版 AV1 软件解码器的性能高 3 倍,可让更多用户(包括一些中低层级的设备)播放高清 AV1 视频。
目前,您的应用需要通过调用 dav1d 名称 "c2.android.av1-dav1d.decoder"
来选择使用 dav1d。在后续更新中,dav1d 将成为默认的 AV1 软件解码器。这项支持已标准化,并向后移植到接收 Google Play 系统更新的 Android 11 设备。
เครื่องมือและประสิทธิภาพการทำงานของนักพัฒนาซอฟต์แวร์
แม้ว่างานส่วนใหญ่ของเราเพื่อปรับปรุงประสิทธิภาพการทำงานจะมุ่งเน้นไปที่เครื่องมือต่างๆ เช่น Android Studio, Jetpack Compose และไลบรารี Android Jetpack แต่เราก็มองหาวิธีต่างๆ ในแพลตฟอร์มอยู่เสมอเพื่อช่วยให้คุณบรรลุเป้าหมายได้ง่ายขึ้น
การอัปเดต OpenJDK 17
Android 15 会继续更新 Android 的核心库,以与最新 OpenJDK LTS 版本中的功能保持一致。
其中包含以下主要功能和改进:
- 改进了 NIO 缓冲区的使用寿命
- 信息流
- 其他
math
和strictmath
方法 util
软件包更新,包括有序的collection
、map
和set
Deflater
中的ByteBuffer
支持- 安全更新,例如
X500PrivateCredential
和安全密钥更新
这些 API 通过 Google Play 系统更新在超过 10 亿台搭载 Android 12(API 级别 31)及更高版本的设备上进行了更新,让您能够以最新的编程功能为目标平台。
การปรับปรุง PDF
Android 15 มีการปรับปรุงที่สำคัญสำหรับ PdfRenderer
API แอปสามารถรวมฟีเจอร์ขั้นสูง เช่น การแสดงผลไฟล์ที่มีการป้องกันด้วยรหัสผ่าน คําอธิบายประกอบ การแก้ไขแบบฟอร์ม การค้นหา และการเลือกพร้อมการคัดลอก PDF เชิงเส้น
รองรับการเพิ่มประสิทธิภาพเพื่อให้ดู PDF ในเครื่องได้เร็วขึ้นและลดการใช้ทรัพยากร
ไลบรารี PDF ของ Jetpack ใช้ API เหล่านี้เพื่อให้การเพิ่ม PDF เป็นเรื่องง่าย
ความสามารถในการดูแอปของคุณ
ย้าย PdfRenderer
ไปยังโมดูลที่อัปเดตได้โดยใช้ Google แล้ว
การอัปเดตระบบ Play โดยไม่ขึ้นอยู่กับการเปิดตัวแพลตฟอร์ม และเราให้การสนับสนุน
การเปลี่ยนแปลงเหล่านี้กลับไปใช้ Android 11 (API ระดับ 30) โดยการสร้าง
แพลตฟอร์ม API ก่อน Android 15 ที่เรียกว่า
PdfRendererPreV
การปรับแต่งการสลับภาษาอัตโนมัติ
Android 14 增加了设备端音频中的多语言识别功能,可在语言之间自动切换,但这可能会导致单词丢失,尤其是在语言切换时,两种话语之间的停顿较少时。Android 15 添加了额外的控件,可帮助应用根据其用例调整此切换。EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS
会将自动切换限制为仅在音频会话开始时进行,而 EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES
则会在指定次数的切换后停用语言切换。如果您希望自动检测到会话期间只讲一种语言,这些选项特别有用。
OpenType Variable Font API ที่ปรับปรุงแล้ว
Android 15 ปรับปรุงความสามารถในการใช้งานแบบอักษรของตัวแปร OpenType ตอนนี้คุณสามารถ
สร้างอินสแตนซ์ FontFamily
จากแบบอักษรของตัวแปรโดยไม่ต้องระบุ
แกนถ่วงน้ำหนักด้วย buildVariableFamily
API ตัวแสดงผลข้อความจะลบล้าง
ค่าของแกน wght
เพื่อให้ตรงกับข้อความที่แสดง
การใช้ API ใหม่จะช่วยให้โค้ดในการสร้าง Typeface
ง่ายขึ้น
อย่างมาก:
Kotlin
val newTypeface = Typeface.CustomFallbackBuilder( FontFamily.Builder( Font.Builder(assets, "RobotoFlex.ttf").build()) .buildVariableFamily()) .build()
Java
Typeface newTypeface = Typeface.CustomFallbackBuilder( new FontFamily.Builder( new Font.Builder(assets, "RobotoFlex.ttf").build()) .buildVariableFamily()) .build();
ก่อนหน้านี้ หากต้องการสร้าง Typeface
เดียวกัน คุณจะต้องมีโค้ดเพิ่มเติมดังนี้
Kotlin
val oldTypeface = Typeface.CustomFallbackBuilder( FontFamily.Builder( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 400") .setWeight(400) .build()) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 100") .setWeight(100) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 200") .setWeight(200) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 300") .setWeight(300) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 500") .setWeight(500) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 600") .setWeight(600) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 700") .setWeight(700) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 800") .setWeight(800) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 900") .setWeight(900) .build() ).build() ).build()
Java
Typeface oldTypeface = new Typeface.CustomFallbackBuilder( new FontFamily.Builder( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 400") .setWeight(400) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 100") .setWeight(100) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 200") .setWeight(200) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 300") .setWeight(300) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 500") .setWeight(500) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 600") .setWeight(600) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 700") .setWeight(700) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 800") .setWeight(800) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 900") .setWeight(900) .build() ) .build() ).build();
นี่คือตัวอย่างวิธีที่ Typeface
สร้างด้วย API ทั้งเก่าและใหม่
แสดงผล:
ในตัวอย่างนี้ Typeface
ที่สร้างด้วย API เดิมไม่มีส่วน
ความสามารถในการสร้างน้ำหนักแบบอักษรที่แม่นยำสำหรับตัวอักษร 350, 450, 550 และ 650
Font
ดังนั้นตัวแสดงผลจะกลับไปอยู่ในน้ำหนักที่ใกล้เคียงที่สุด ดังนั้นใน
ในกรณีนี้ แสดงผล 300 แทน 350, แสดงผล 400 แทน 450 และ
เป็นต้น ในทางตรงกันข้าม Typeface
ที่สร้างด้วย API ใหม่จะสร้าง
อินสแตนซ์ Font
สำหรับน้ำหนักที่ระบุ ดังนั้นระบบจะแสดงผลน้ำหนักที่ถูกต้องเป็น 350
450, 550 และ 650 ด้วย
การควบคุมการขึ้นบรรทัดใหม่แบบละเอียด
ตั้งแต่ Android 15 เป็นต้นไป TextView
และตัวแบ่งบรรทัดที่สำคัญจะเก็บรักษาข้อความที่ระบุในบรรทัดเดียวกันไว้เพื่อให้อ่านง่ายขึ้น คุณใช้ประโยชน์จากการปรับเปลี่ยนการขึ้นบรรทัดใหม่นี้ได้โดยการใช้แท็ก <nobreak>
ในทรัพยากรสตริงหรือ createNoBreakSpan
ในทำนองเดียวกัน คุณสามารถคงคำไม่ให้มีการแบ่งวรรคโดยใช้แท็ก <nohyphen>
หรือ createNoHyphenationSpan
ตัวอย่างเช่น ทรัพยากรสตริงต่อไปนี้ไม่มีการขึ้นบรรทัดใหม่ และแสดงผลโดยตัดข้อความ "Pixel 8 Pro" ตรงที่ไม่ต้องการ
<resources>
<string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>
ในทางตรงกันข้าม ทรัพยากรสตริงนี้จะมีแท็ก <nobreak>
ซึ่งตัดวลี "Pixel 8 Pro" และป้องกันการขึ้นบรรทัดใหม่:
<resources>
<string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>
ความแตกต่างของวิธีแสดงผลสตริงเหล่านี้จะแสดงอยู่ในรูปภาพต่อไปนี้
การเก็บแอป
Android และ Google Play ได้ประกาศรองรับการเก็บถาวรของแอปไปเมื่อปีที่ผ่านมา ซึ่งช่วยให้ผู้ใช้เพิ่มพื้นที่ว่างได้ด้วยการนําแอปที่ไม่ได้ใช้บ่อยออกจากอุปกรณ์บางส่วน ซึ่งเผยแพร่โดยใช้ Android App Bundle ใน Google Play Android 15 มีการรองรับการเก็บถาวรแอปในระดับระบบปฏิบัติการ และยกเลิกการเก็บ ซึ่งจะทำให้ App Store ทั้งหมดติดตั้งใช้งานได้ง่ายขึ้น
แอปที่มีสิทธิ์ REQUEST_DELETE_PACKAGES
สามารถเรียกใช้เมธอด requestArchive
ของ PackageInstaller
เพื่อขอเก็บถาวรแพ็กเกจแอปที่ติดตั้ง ซึ่งจะนำ APK และไฟล์แคชทั้งหมดออก แต่จะเก็บข้อมูลผู้ใช้ไว้ แอปที่เก็บถาวรจะแสดงผลเป็นแอปที่แสดงได้ผ่าน
LauncherApps
API ผู้ใช้จะเห็นตัวเลือก UI เพื่อไฮไลต์
เก็บแอปพลิเคชันแล้ว หากผู้ใช้แตะแอปที่เก็บไว้ ผู้ติดตั้งที่รับผิดชอบจะได้รับคําขอให้ยกเลิกการเก็บ และสามารถตรวจสอบกระบวนการกู้คืนได้โดยการออกอากาศ ACTION_PACKAGE_ADDED
เปิดใช้โหมด 16 KB ในอุปกรณ์โดยใช้ตัวเลือกสำหรับนักพัฒนาแอป
ตั้งแต่ Android 15 QPR1 เป็นต้นไป คุณสามารถใช้ตัวเลือกสำหรับนักพัฒนาแอปที่มีให้ในอุปกรณ์บางรุ่นเพื่อบูตอุปกรณ์ในโหมด 16 KB และทำการทดสอบในอุปกรณ์
ตัวเลือกสำหรับนักพัฒนาแอปนี้พร้อมใช้งานในอุปกรณ์ต่อไปนี้
- Pixel 8 และ 8 Pro (ที่ใช้ Android 15 QPR1 ขึ้นไป)
- Pixel 8a (ที่ใช้ Android 15 QPR1 ขึ้นไป)
กราฟิก
Android 15 มีการปรับปรุงกราฟิกล่าสุด ซึ่งรวมถึง ANGLE และการเพิ่มลงในระบบกราฟิก Canvas
ปรับปรุงการเข้าถึง GPU ของ Android ให้ทันสมัย
从早期开始,核心操作系统在单个 CPU 上运行,GPU 通过基于固定函数流水线的 API 进行访问,Android 硬件已经发生了很大变化。从 Android 7.0(API 级别 24)开始,NDK 中就已提供 Vulkan® 图形 API。它采用较低级别的抽象,可以更好地反映现代 GPU 硬件,能够更好地进行扩展以支持多个 CPU 核心,并可减少 CPU 驱动程序开销,从而提升应用性能。所有现代游戏引擎都支持 Vulkan。
Vulkan 是 Android 的 GPU 首选接口。因此,Android 15 包含 ANGLE 作为可选层,用于在 Vulkan 上运行 OpenGL® ES。迁移到 ANGLE 会将 Android OpenGL 实现标准化,以提高兼容性,在某些情况下还可提升性能。您可以使用 ANGLE 测试 OpenGL ES 应用的稳定性和性能,方法是在 Android 15 上依次点击设置 -> 系统 -> 开发者选项 -> 实验性功能:启用 ANGLE,启用开发者选项。
Vulkan 上的 Android ANGLE 路线图
作为简化 GPU 堆栈的一部分,今后我们将在更多新设备上以 GL 系统驱动程序的形式提供 ANGLE,预计未来将只能通过 ANGLE 使用 OpenGL/ES。不过,我们计划在所有设备上继续支持 OpenGL ES。
建议的后续措施
使用开发者选项选择适用于 OpenGL ES 的 ANGLE 驱动程序并测试您的应用。对于新项目,我们强烈建议您使用适用于 C/C++ 的 Vulkan。
การปรับปรุงสำหรับ Canvas
Android 15 继续对 Android 的 Canvas 图形系统进行现代化改造,并增添了新功能:
Matrix44
提供了一个用于转换坐标的 4x4 矩阵,当您想要处理 3D 画布时,应使用此矩阵。clipShader
将当前裁剪与指定着色器相交,而clipOutShader
会将裁剪设置为当前裁剪和着色器的差异,其中各自将着色器视为 Alpha 蒙版。这有助于高效绘制复杂形状。
ประสิทธิภาพและแบตเตอรี่
Android ยังคงมุ่งเน้นที่การช่วยปรับปรุงประสิทธิภาพและคุณภาพของแอป Android 15 เปิดตัว API ที่ช่วยทําให้งานในแอปมีประสิทธิภาพมากขึ้น เพิ่มประสิทธิภาพแอป และรวบรวมข้อมูลเชิงลึกเกี่ยวกับแอป
ดูแนวทางปฏิบัติแนะนำเพื่อประหยัดแบตเตอรี่ การแก้ไขข้อบกพร่องเครือข่ายและการใช้พลังงาน รวมถึงรายละเอียดเกี่ยวกับวิธีที่เราปรับปรุงประสิทธิภาพแบตเตอรี่ของงานเบื้องหลังใน Android 15 และ Android เวอร์ชันล่าสุดได้ที่การบรรยายเรื่องการปรับปรุงประสิทธิภาพแบตเตอรี่ของงานเบื้องหลังใน Android จาก Google I/O
ApplicationStartInfo API
在以前的 Android 版本中,应用启动有点神秘。在应用中确定应用是从冷状态、温状态还是热状态开始的过程很难确定。此外,我们也很难知道您的应用在不同发布阶段所用的时间:创建进程分支、调用 onCreate
、绘制第一帧等。在实例化 Application
类时,您无法得知应用是从广播、content provider、作业、备份、启动完成、闹钟还是 Activity
启动的。
Android 15 上的 ApplicationStartInfo
API 可提供所有这些功能以及更多其他功能。您甚至可以选择将自己的时间戳添加到流程中,以便在一个位置收集时间数据。除了收集指标之外,您还可以使用 ApplicationStartInfo
直接优化应用启动;例如,当应用因广播而启动时,您可以避免在 Application
类中实例化界面相关库的高成本。
ข้อมูลขนาดแอปโดยละเอียด
自 Android 8.0(API 级别 26)起,Android 就一直包含 StorageStats.getAppBytes
API,该 API 将应用的安装大小汇总为一个字节,这些字节是 APK 大小、从 APK 中提取的文件的大小以及设备上生成的文件(例如预先 (AOT) 编译代码)的总和。就应用的存储空间使用情况而言,此数字并不富有见解。
Android 15 增加了 StorageStats.getAppBytesByDataType([type])
API,可让您深入了解应用如何使用所有空间,包括 APK 文件拆分、AOT 和加速相关代码、dex 元数据、库和引导式配置文件。
โปรไฟล์ที่จัดการโดยแอป
Android 15 มีคลาส ProfilingManager
ซึ่งช่วยให้คุณรวบรวมข้อมูลการโปรไฟล์จากภายในแอปได้ เช่น การดัมพ์กอง โปรไฟล์กอง สุ่มตัวอย่างสแต็ก และอื่นๆ โดยจะทำการเรียกกลับไปยังแอปด้วยแท็กที่ระบุเพื่อระบุไฟล์เอาต์พุต ซึ่งระบบจะส่งไปยังไดเรกทอรีไฟล์ของแอป API จะจำกัดอัตราเพื่อลดผลกระทบด้านประสิทธิภาพ
เราขอแนะนําให้ใช้ Profiling
AndroidX API ที่เกี่ยวข้องเพื่อลดความซับซ้อนในการสร้างคําขอโปรไฟล์ในแอป ซึ่งพร้อมใช้งานใน Core 1.15.0-rc01 ขึ้นไป
การปรับปรุงฐานข้อมูล SQLite
Android 15 เปิดตัว SQLite API ที่แสดงฟีเจอร์ขั้นสูงจากเครื่องมือ SQLite ที่อยู่เบื้องหลังซึ่งมุ่งเน้นปัญหาด้านประสิทธิภาพที่เฉพาะเจาะจงซึ่งอาจแสดงในแอป API เหล่านี้มาพร้อมกับการอัปเดต SQLite เป็นเวอร์ชัน 3.44.3
นักพัฒนาแอปควรอ่านแนวทางปฏิบัติแนะนำสำหรับประสิทธิภาพของ SQLite เพื่อใช้ประโยชน์จากฐานข้อมูล SQLite ให้ได้สูงสุด โดยเฉพาะเมื่อทำงานกับ หรือเมื่อเรียกใช้การค้นหาที่คำนึงถึงเวลาในการตอบสนอง
- ธุรกรรมที่รอดำเนินการแบบอ่านอย่างเดียว: เมื่อออกธุรกรรมแบบอ่านอย่างเดียว (ไม่มีคำสั่งเขียน) ให้ใช้
beginTransactionReadOnly()
และbeginTransactionWithListenerReadOnly(SQLiteTransactionListener)
เพื่อออกธุรกรรมDEFERRED
แบบอ่านอย่างเดียว ธุรกรรมดังกล่าวทำงานได้ พร้อมๆ กัน และถ้าฐานข้อมูลอยู่ในโหมด WAL จะสามารถส่ง ทำงานพร้อมกันกับธุรกรรมIMMEDIATE
หรือEXCLUSIVE
- จำนวนแถวและรหัส: มีการเพิ่ม API เพื่อเรียกข้อมูลจำนวนที่มีการเปลี่ยนแปลง
หรือรหัสแถวที่แทรกล่าสุดโดยไม่ต้องส่งคำขอเพิ่มเติม
getLastChangedRowCount()
จะแสดงจํานวนแถวที่แทรก อัปเดต หรือลบโดยคำสั่ง SQL ล่าสุดภายในธุรกรรมปัจจุบัน ส่วนgetTotalChangedRowCount()
จะแสดงจํานวนการเชื่อมต่อปัจจุบันgetLastInsertRowId()
แสดงผลrowid
ของแถวสุดท้าย ที่จะแทรกลงในการเชื่อมต่อปัจจุบัน - ข้อความดิบ: ออกคำสั่ง SQlite ดิบโดยหลีกเลี่ยงความสะดวก Wrapper และค่าใช้จ่ายในการประมวลผลเพิ่มเติมอื่นๆ ที่อาจเกิดขึ้น
การอัปเดตเฟรมเวิร์กประสิทธิภาพแบบไดนามิกของ Android
Android 15 继续投资开发 Android 动态性能框架 (ADPF),这是一组 API,可让游戏和性能密集型应用更直接地与 Android 设备的电源和散热系统进行互动。在受支持的设备上,Android 15 将添加新的 ADPF 功能:
- 适用于提示会话的节能模式,用于指明其关联的线程应该优先考虑节能而非性能,非常适合长时间运行的后台工作负载。
- 可以在提示会话中报告 GPU 和 CPU 的运行时长,从而使系统能够同时调整 CPU 和 GPU 频率,以便更好地满足工作负载需求。
- 热余量阈值,用于根据余量预测来解释可能的热节流状态。
如需详细了解如何在应用和游戏中使用 ADPF,请参阅相关文档。
ความเป็นส่วนตัว
Android 15 มีฟีเจอร์มากมายที่จะช่วยนักพัฒนาแอปปกป้องความเป็นส่วนตัวของผู้ใช้
การตรวจจับการบันทึกหน้าจอ
Android 15 เพิ่มการรองรับแอปเพื่อตรวจจับว่ามีการบันทึกเสียง ระบบจะเรียกใช้การเรียกกลับทุกครั้งที่แอปเปลี่ยนสถานะระหว่างมองเห็นหรือไม่มองเห็นภายในการบันทึกหน้าจอ แอปคือ ถือว่ามองเห็นได้หากกิจกรรมที่เป็นของ UID ของกระบวนการลงทะเบียนนั้น มีการบันทึก วิธีนี้ช่วยให้คุณแจ้งให้ผู้ใช้ทราบว่ามีการบันทึกเสียงอยู่ได้ หากแอปของคุณดําเนินการที่มีความละเอียดอ่อน
val mCallback = Consumer<Int> { state ->
if (state == SCREEN_RECORDING_STATE_VISIBLE) {
// We're being recorded
} else {
// We're not being recorded
}
}
override fun onStart() {
super.onStart()
val initialState =
windowManager.addScreenRecordingCallback(mainExecutor, mCallback)
mCallback.accept(initialState)
}
override fun onStop() {
super.onStop()
windowManager.removeScreenRecordingCallback(mCallback)
}
ความสามารถที่ขยายการให้บริการของ IntentFilter
Android 15 รองรับความละเอียดของ Intent
ที่แม่นยำยิ่งขึ้นผ่าน UriRelativeFilterGroup
ซึ่งมีชุดออบเจ็กต์ UriRelativeFilter
ที่ประกอบขึ้นเป็นชุดกฎการจับคู่ Intent
ที่ต้องปฏิบัติตามแต่ละส่วน เช่น พารามิเตอร์การค้นหา URL, ส่วนย่อยของ URL และกฎการบล็อกหรือการยกเว้น
คุณกำหนดกฎเหล่านี้ในไฟล์ XML AndroidManifest
ได้ด้วยแท็ก <uri-relative-filter-group>
ซึ่งอาจรวมแท็ก android:allow
หรือไม่ก็ได้ แท็กเหล่านี้อาจมีแท็ก <data>
ที่ใช้แอตทริบิวต์แท็กที่มีอยู่ รวมถึงแอตทริบิวต์ android:query
และ android:fragment
ตัวอย่างไวยากรณ์ AndroidManifest
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:domain="astore.com" />
<uri-relative-filter-group>
<data android:pathPrefix="/auth" />
<data android:query="region=na" />
</uri-relative-filter-group>
<uri-relative-filter-group android:allow="false">
<data android:pathPrefix="/auth" />
<data android:query="mobileoptout=true" />
</uri-relative-filter-group>
<uri-relative-filter-group android:allow="false">
<data android:pathPrefix="/auth" />
<data android:fragmentPrefix="faq" />
</uri-relative-filter-group>
</intent-filter>
พื้นที่ส่วนตัว
พื้นที่ส่วนตัวช่วยให้ผู้ใช้สร้างพื้นที่แยกต่างหากในอุปกรณ์ได้ ป้องกันแอปที่ละเอียดอ่อนให้พ้นจากสายตาที่คอยสอดแนม การตรวจสอบสิทธิ์ พื้นที่ส่วนตัวจะใช้โปรไฟล์ผู้ใช้แยกต่างหาก ผู้ใช้สามารถ เลือกใช้การล็อกอุปกรณ์หรือเครื่องมือล็อกแยกต่างหากสำหรับพื้นที่ส่วนตัว
แอปในพื้นที่ส่วนตัวจะปรากฏในคอนเทนเนอร์แยกต่างหากใน Launcher และ ซ่อนจากมุมมองล่าสุด การแจ้งเตือน การตั้งค่า และจากแอปอื่นๆ เมื่อพื้นที่ส่วนตัวล็อกอยู่ เนื้อหาที่ผู้ใช้สร้างขึ้นและดาวน์โหลด (เช่น สื่อหรือไฟล์) และบัญชีจะแยกจากกันระหว่างพื้นที่ส่วนตัวและ พื้นที่หลัก Sharesheet ของระบบและ สามารถใช้เครื่องมือเลือกรูปภาพเพื่อให้แอปเข้าถึงเนื้อหา ข้ามพื้นที่ทำงานเมื่อปลดล็อกพื้นที่ส่วนตัวแล้ว
ผู้ใช้จะย้ายแอปที่มีอยู่และข้อมูลของแอปไปยังพื้นที่ส่วนตัวไม่ได้ แต่ ผู้ใช้เลือกตัวเลือกการติดตั้งในพื้นที่ส่วนตัวเพื่อติดตั้งแอปโดยใช้ ร้านแอปใดก็ได้ที่พวกเขาชื่นชอบ แอปในพื้นที่ส่วนตัวจะได้รับการติดตั้งเป็น แยกจากแอปใดก็ได้ในพื้นที่หลัก (สำเนาใหม่ของแอปเดียวกัน)
เมื่อผู้ใช้ล็อกพื้นที่ส่วนตัว โปรไฟล์จะหยุดลง ขณะที่โปรไฟล์ หยุดทำงาน แอปในพื้นที่ส่วนตัวจะไม่ทำงานอีกต่อไปและไม่สามารถทำงานได้ กิจกรรมเบื้องหน้าหรือเบื้องหลัง ซึ่งรวมถึงการแสดงการแจ้งเตือน
เราขอแนะนำให้คุณทดสอบแอปกับพื้นที่ส่วนตัวเพื่อให้แอป ทำงานได้ตามที่คาดไว้ โดยเฉพาะเมื่อแอปของคุณจัดอยู่ในประเภทใดประเภทหนึ่งต่อไปนี้ หมวดหมู่:
- แอปที่มีตรรกะสำหรับโปรไฟล์งานที่สันนิษฐานว่า สำเนาที่ติดตั้งของแอปซึ่งไม่ได้อยู่ในโปรไฟล์หลักจะอยู่ใน โปรไฟล์งาน
- แอปการแพทย์
- แอป Launcher
- แอปใน App Store
ค้นหาการเลือกล่าสุดของผู้ใช้สำหรับการเข้าถึงรูปภาพที่เลือก
ตอนนี้แอปจะไฮไลต์ได้เฉพาะรูปภาพและวิดีโอที่เลือกล่าสุดเท่านั้นเมื่อได้รับสิทธิ์การเข้าถึงบางส่วนในสื่อ ฟีเจอร์นี้จะช่วยปรับปรุงประสบการณ์ของผู้ใช้สำหรับแอปที่ขอสิทธิ์เข้าถึงรูปภาพและวิดีโอบ่อยครั้ง หากต้องการใช้ฟีเจอร์นี้ในแอป ให้เปิดใช้อาร์กิวเมนต์ QUERY_ARG_LATEST_SELECTION_ONLY
เมื่อค้นหา MediaStore
ผ่าน ContentResolver
Kotlin
val externalContentUri = MediaStore.Files.getContentUri("external") val mediaColumns = arrayOf( FileColumns._ID, FileColumns.DISPLAY_NAME, FileColumns.MIME_TYPE, ) val queryArgs = bundleOf( // Return only items from the last selection (selected photos access) QUERY_ARG_LATEST_SELECTION_ONLY to true, // Sort returned items chronologically based on when they were added to the device's storage QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC", QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?", QUERY_ARG_SQL_SELECTION_ARGS to arrayOf( FileColumns.MEDIA_TYPE_IMAGE.toString(), FileColumns.MEDIA_TYPE_VIDEO.toString() ) )
Java
Uri externalContentUri = MediaStore.Files.getContentUri("external"); String[] mediaColumns = { FileColumns._ID, FileColumns.DISPLAY_NAME, FileColumns.MIME_TYPE }; Bundle queryArgs = new Bundle(); queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true); queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC"); queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?"); queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] { String.valueOf(FileColumns.MEDIA_TYPE_IMAGE), String.valueOf(FileColumns.MEDIA_TYPE_VIDEO) });
Privacy Sandbox ใน Android
Android 15 包含最新的 Android 广告服务扩展程序,以及最新版 Privacy Sandbox on Android。我们致力于开发新的技术,以便更好地保护用户隐私,并为移动应用打造有效的个性化广告体验。这项新功能是我们的工作的一部分。我们的隐私沙盒页面详细介绍了 Privacy Sandbox on Android 开发者预览版和 Beta 版计划,以帮助您开始使用。
Health Connect
Android 15 ผสานรวมส่วนขยายล่าสุดเกี่ยวกับ Health Connect โดย Android ซึ่งเป็นแพลตฟอร์มที่ปลอดภัยและเป็นศูนย์กลางสำหรับจัดการและแชร์ข้อมูลสุขภาพและการออกกำลังกายที่แอปรวบรวม การอัปเดตนี้ เพิ่มการรองรับประเภทข้อมูลเพิ่มเติมในฟิตเนส ข้อมูลโภชนาการ อุณหภูมิผิวหนัง แผนการออกกำลังกาย และอื่นๆ
การติดตามอุณหภูมิผิวหนังช่วยให้ผู้ใช้จัดเก็บและแชร์ได้แม่นยำยิ่งขึ้น ข้อมูลอุณหภูมิจากอุปกรณ์ที่สวมใส่ได้หรืออุปกรณ์ติดตามอื่นๆ
แผนการออกกำลังกายคือแผนการออกกำลังกายที่มีโครงสร้างเพื่อช่วยให้ผู้ใช้ออกกำลังกายได้เต็มที่ เป้าหมาย การรองรับแผนการฝึกอบรมจะรวมถึงการสำเร็จหลักสูตรและประสิทธิภาพที่หลากหลาย เป้าหมาย:
- เป้าหมายที่สำเร็จเกี่ยวกับแคลอรี่ที่ใช้ไป ระยะทาง, ระยะเวลา การทำซ้ำและจำนวนก้าว
- เป้าหมายด้านประสิทธิภาพที่เกี่ยวข้องกับการทำซ้ำให้ได้มากที่สุด (AMRAP), ความถี่, อัตราการเต้นของหัวใจ, กำลัง, ระดับความเหนื่อยล้าที่รับรู้ และความเร็ว
ดูข้อมูลเพิ่มเติมเกี่ยวกับการอัปเดตล่าสุดของ Health Connect ใน Android ใน การสร้างประสบการณ์การใช้งานแบบปรับเปลี่ยนได้ด้วย Android การพูดคุยด้านสุขภาพจาก Google I/O
การแชร์หน้าจอแอป
Android 15 รองรับการแชร์หน้าจอแอปเพื่อให้ผู้ใช้แชร์หรือบันทึกเฉพาะหน้าต่างแอปแทนทั้งหน้าจอของอุปกรณ์ได้ ฟีเจอร์นี้เปิดใช้ใน Android 14 QPR2 เป็นครั้งแรก โดยมีMediaProjection
การเรียกกลับที่ช่วยให้แอปของคุณปรับแต่งประสบการณ์การแชร์หน้าจอของแอปได้ โปรดทราบว่าแอปที่กําหนดเป้าหมายเป็น Android 14 (API ระดับ 34) ขึ้นไปต้องได้รับความยินยอมจากผู้ใช้สําหรับเซสชันการจับภาพ MediaProjection
แต่ละเซสชัน
ประสบการณ์ของผู้ใช้และ UI ของระบบ
Android 15 ช่วยให้นักพัฒนาแอปและผู้ใช้ควบคุมและปรับเปลี่ยนการกำหนดค่าอุปกรณ์ให้เหมาะกับความต้องการของตนได้มากขึ้น
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้การปรับปรุงล่าสุดใน Android 15 เพื่อปรับปรุงประสบการณ์ของผู้ใช้แอปได้จากวิดีโอการบรรยายเรื่องปรับปรุงประสบการณ์ของผู้ใช้แอป Android จาก Google I/O
ตัวอย่างวิดเจ็ตที่สมบูรณ์ยิ่งขึ้นด้วย Generated Previews API
ก่อน Android 15 วิธีเดียวในการแสดงตัวอย่างเครื่องมือเลือกวิดเจ็ตคือต้องระบุทรัพยากรรูปภาพหรือเลย์เอาต์แบบคงที่ ตัวอย่างเหล่านี้มักจะแตกต่างจากลักษณะของวิดเจ็ตจริงเมื่อวางไว้ในหน้าจอหลักอย่างมาก นอกจากนี้ ทรัพยากรแบบคงที่ไม่อาจสร้างได้ด้วย Jetpack Glance ดังนั้นข้อมูลโดยย่อ นักพัฒนาซอฟต์แวร์ต้องจับภาพหน้าจอวิดเจ็ตของตน หรือสร้างเค้าโครง XML เพื่อให้ ตัวอย่างวิดเจ็ต
Android 15 เพิ่มการรองรับตัวอย่างที่สร้างขึ้น ซึ่งหมายความว่าผู้ให้บริการวิดเจ็ตแอปสามารถสร้าง RemoteViews
เพื่อใช้เป็นตัวอย่างเครื่องมือเลือกแทนทรัพยากรแบบคงที่
Push API
แอปสามารถแสดงตัวอย่างที่สร้างขึ้นผ่าน Push API แอปช่วยคุณได้
แสดงตัวอย่างได้ทุกเมื่อในวงจร และไม่ได้รับคำขอที่ชัดแจ้ง
จากโฮสต์เพื่อแสดงตัวอย่าง ระบบจะเก็บตัวอย่างเพลงไว้ใน AppWidgetService
และผู้จัดการประชุมจะขอตัวอย่างเพลงได้แบบออนดีมานด์ ตัวอย่างต่อไปนี้จะโหลดทรัพยากรเลย์เอาต์วิดเจ็ต XML และตั้งค่าเป็นตัวอย่าง
AppWidgetManager.getInstance(appContext).setWidgetPreview(
ComponentName(
appContext,
SociaLiteAppWidgetReceiver::class.java
),
AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
RemoteViews("com.example", R.layout.widget_preview)
)
ขั้นตอนที่คาดไว้มีดังนี้
- ผู้ให้บริการวิดเจ็ตเรียก
setWidgetPreview
ได้ทุกเมื่อ ระบบจะเก็บตัวอย่างเพลงที่ระบุไว้ในAppWidgetService
ไว้พร้อมกับข้อมูลอื่นๆ ของผู้ให้บริการ setWidgetPreview
จะแจ้งโฮสต์เกี่ยวกับตัวอย่างที่อัปเดตแล้วผ่าน การติดต่อกลับของAppWidgetHost.onProvidersChanged
ในการตอบสนอง วิดเจ็ต โฮสต์จะโหลดข้อมูลผู้ให้บริการทั้งหมดซ้ำ- เมื่อแสดงตัวอย่างวิดเจ็ต โฮสต์จะตรวจสอบ
AppWidgetProviderInfo.generatedPreviewCategories
และหากเลือก มีหมวดหมู่ ติดต่อAppWidgetManager.getWidgetPreview
ไปยัง ให้แสดงตัวอย่างที่บันทึกไว้สำหรับผู้ให้บริการรายนี้
กรณีที่ควรโทรหา setWidgetPreview
เนื่องจากไม่มีคอลแบ็กให้แสดงตัวอย่าง แอปจึงเลือกส่งตัวอย่างได้ทุกเมื่อขณะที่ทำงานอยู่ ความถี่ในการอัปเดตตัวอย่างจะขึ้นอยู่กับกรณีการใช้งานวิดเจ็ต
รายการต่อไปนี้อธิบายกรณีการใช้งานตัวอย่างเพลงหลัก 2 หมวดหมู่
- ผู้ให้บริการที่แสดงข้อมูลจริงในตัวอย่างวิดเจ็ต เช่น หรือข้อมูลล่าสุด ผู้ให้บริการเหล่านี้สามารถตั้งค่าตัวอย่างเพลงได้เมื่อผู้ใช้ลงชื่อเข้าใช้หรือทำการกําหนดค่าเริ่มต้นในแอปแล้ว หลังจากนั้น ผู้ให้บริการจะตั้งค่างานเป็นระยะเพื่ออัปเดตตัวอย่างเพลงตามช่วงเวลาที่เลือกได้ ตัวอย่างของวิดเจ็ตประเภทนี้อาจเป็นรูปภาพ ปฏิทิน สภาพอากาศ หรือข่าว วิดเจ็ต
- ผู้ให้บริการที่แสดงข้อมูลแบบคงที่ในตัวอย่างหรือวิดเจ็ตการดำเนินการด่วนซึ่งไม่แสดงข้อมูลใดๆ ผู้ให้บริการเหล่านี้สามารถ ตั้งค่าการแสดงตัวอย่างได้ 1 ครั้งเมื่อ เปิดแอปครั้งแรก ตัวอย่างของวิดเจ็ตประเภทนี้ ได้แก่ ไดรฟ์ไวท์ วิดเจ็ตการดำเนินการ หรือวิดเจ็ตทางลัดของ Chrome
ผู้ให้บริการบางรายอาจแสดงตัวอย่างแบบคงที่ในเครื่องมือเลือกโหมดฮับ แต่แสดงจริง ในเครื่องมือเลือกหน้าจอหลัก ผู้ให้บริการเหล่านี้ควรปฏิบัติตามคำแนะนำ สำหรับกรณีการใช้งานทั้ง 2 อย่างนี้ในการตั้งค่าตัวอย่าง
การแสดงภาพซ้อนภาพ
Android 15 เปิดตัวการเปลี่ยนแปลงในฟีเจอร์การแสดงภาพซ้อนภาพ (PIP) เพื่อให้การเปลี่ยนผ่านเป็นไปอย่างราบรื่นยิ่งขึ้นเมื่อเข้าสู่โหมด PIP ซึ่งจะเป็นประโยชน์ต่อแอปที่มีองค์ประกอบ UI ซ้อนทับบน UI หลัก ซึ่งจะอยู่ในรูปแบบ PIP
นักพัฒนาแอปใช้การเรียกกลับ onPictureInPictureModeChanged
เพื่อกำหนดตรรกะในการสลับการแสดงผลขององค์ประกอบ UI ที่วางซ้อน Callback นี้จะทริกเกอร์เมื่อภาพเคลื่อนไหวของ PiP เข้าหรือออกเสร็จสมบูรณ์ ตั้งแต่ Android 15 เป็นต้นไป คลาส PictureInPictureUiState
จะมีสถานะอื่น
เมื่อใช้สถานะ UI นี้ แอปที่กำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) จะสังเกตเห็นว่ามีการเรียกใช้การเรียกกลับ Activity#onPictureInPictureUiStateChanged
ด้วย isTransitioningToPip()
ทันทีที่ภาพ PiP เริ่มแสดงภาพเคลื่อนไหว มีองค์ประกอบ UI จำนวนมากที่ไม่เกี่ยวข้องกับแอปเมื่ออยู่ในโหมด PIP เช่น มุมมองหรือเลย์เอาต์ที่มีข้อมูลอย่างเช่นคำแนะนำ วิดีโอที่กำลังจะเผยแพร่ การจัดประเภท และชื่อ เมื่อแอปไปยังโหมด PIP ให้ใช้ Callback onPictureInPictureUiStateChanged
เพื่อซ่อนองค์ประกอบ UI เหล่านี้ เมื่อแอปเปลี่ยนไปใช้โหมดเต็มหน้าจอจากหน้าต่าง PiP ให้ใช้การเรียกกลับ onPictureInPictureModeChanged
เพื่อเลิกซ่อนองค์ประกอบเหล่านี้ ดังที่แสดงในตัวอย่างต่อไปนี้
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
if (pipState.isTransitioningToPip()) {
// Hide UI elements
}
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
if (isInPictureInPictureMode) {
// Unhide UI elements
}
}
การเปิด/ปิดการแสดงผลองค์ประกอบ UI ที่ไม่เกี่ยวข้องอย่างรวดเร็ว (สำหรับหน้าต่าง PiP) นี้จะช่วยให้ภาพเคลื่อนไหวของ PiP ปรากฏขึ้นอย่างราบรื่นและไม่มีภาพกะพริบ
กฎโหมดห้ามรบกวนที่ได้รับการปรับปรุง
AutomaticZenRule
อนุญาตให้แอปปรับแต่งความสนใจได้
การจัดการกฎ (ห้ามรบกวน) และเลือกว่าจะเปิดหรือปิดใช้งานเมื่อใด
ให้พวกเขา Android 15 ช่วยเพิ่มประสิทธิภาพให้กฎเหล่านี้อย่างมาก โดยมีเป้าหมายเพื่อปรับปรุง
ประสบการณ์ของผู้ใช้ การปรับปรุงเหล่านี้มีดังนี้
- กำลังเพิ่มประเภทลงใน
AutomaticZenRule
เพื่อให้ระบบใช้แบบพิเศษได้ กับกฎบางอย่าง - การเพิ่มไอคอนลงใน
AutomaticZenRule
ช่วยให้โหมดต่างๆ เป็นที่รู้จักมากขึ้น - การเพิ่มสตริง
triggerDescription
ในAutomaticZenRule
ที่อธิบาย เงื่อนไขที่กฎควรทำงานสำหรับผู้ใช้ - เพิ่มเมื่อ
ZenDeviceEffects
เป็นAutomaticZenRule
เพื่อให้กฎเรียกใช้สิ่งต่างๆ เช่น โทนสีเทา จอแสดงผล โหมดกลางคืน หรือการหรี่แสงวอลเปเปอร์
ตั้งค่า VibrationEffect สำหรับช่องทางการแจ้งเตือน
Android 15 รองรับการตั้งค่าการสั่นแบบริชมีเดียสำหรับการแจ้งเตือนขาเข้าตามแชแนลโดยใช้ NotificationChannel.setVibrationEffect
เพื่อให้ผู้ใช้แยกแยะการแจ้งเตือนประเภทต่างๆ ได้โดยไม่ต้องมองที่อุปกรณ์
ชิปแถบสถานะการฉายภาพสื่อและการหยุดอัตโนมัติ
การฉายสื่ออาจเปิดเผยข้อมูลส่วนตัวของผู้ใช้ ชิปแถบสถานะใหม่ที่เห็นได้ชัดจะช่วยให้ผู้ใช้ทราบถึงการฉายหน้าจอที่ดำเนินอยู่ ผู้ใช้สามารถแตะชิปเพื่อหยุดแคสต์ แชร์ หรือบันทึกหน้าจอ นอกจากนี้ การแสดงภาพหน้าจอที่ดำเนินการอยู่จะหยุดโดยอัตโนมัติเมื่อหน้าจออุปกรณ์ล็อกอยู่ เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ใช้งานง่ายยิ่งขึ้น
หน้าจอขนาดใหญ่และรูปแบบของอุปกรณ์
Android 15 รองรับแอปของคุณเพื่อให้ได้รับประโยชน์สูงสุดจากรูปแบบของ Android ซึ่งรวมถึงหน้าจอขนาดใหญ่ อุปกรณ์แบบพลิก และอุปกรณ์แบบพับได้
การทํางานหลายอย่างพร้อมกันบนหน้าจอขนาดใหญ่ที่ปรับปรุงใหม่
Android 15 ช่วยให้ผู้ใช้ทำงานหลายอย่างพร้อมกันในอุปกรณ์หน้าจอขนาดใหญ่ได้ดียิ่งขึ้น สำหรับ เช่น ผู้ใช้สามารถบันทึกชุดแอปที่ใช้ร่วมกันที่ชอบเพื่อใช้โหมดแยกหน้าจอได้อย่างรวดเร็ว เข้าถึงและปักหมุดแถบงานบนหน้าจอเพื่อสลับไปมาระหว่างแอปต่างๆ ได้อย่างรวดเร็ว ซึ่งหมายความว่า การทำให้แอปของคุณปรับเปลี่ยนได้นั้นสำคัญกว่าที่เคย
Google I/O มีเซสชันเกี่ยวกับการสร้าง Android แบบปรับอัตโนมัติ แอปและการสร้าง UI ด้วย Material 3 ไลบรารีแบบปรับอัตโนมัติ ที่ช่วยได้ และเอกสารของเรายังมีสิ่งอื่นๆ ที่ช่วยคุณออกแบบ
การรองรับหน้าจอปก
Your app can declare a property that Android 15 uses to
allow your Application
or Activity
to be presented on the small cover
screens of supported flippable devices. These screens are too small to be
considered as compatible targets for Android apps to run on, but your app can
opt in to supporting them, making your app available in more places.
การเชื่อมต่อ
Android 15 อัปเดตแพลตฟอร์มเพื่อให้แอปของคุณเข้าถึงเทคโนโลยีการสื่อสารและเทคโนโลยีไร้สายที่ก้าวหน้าล่าสุด
การสนับสนุนผ่านดาวเทียม
Android 15 ยังคงขยายการรองรับแพลตฟอร์มสำหรับการเชื่อมต่อผ่านดาวเทียมต่อไป และ มีองค์ประกอบ UI บางอย่างเพื่อให้มั่นใจว่าผู้ใช้จะได้รับประสบการณ์ที่สอดคล้องกันทั่วทั้ง การเชื่อมต่อผ่านดาวเทียม
แอปสามารถใช้ ServiceState.isUsingNonTerrestrialNetwork()
เพื่อ
ตรวจจับเมื่ออุปกรณ์เชื่อมต่อกับดาวเทียม ทำให้อุปกรณ์รับรู้ถึง
สาเหตุที่บริการเครือข่ายเต็มรูปแบบอาจใช้ไม่ได้ นอกจากนี้ Android 15 ยังรองรับแอป SMS และ MMS รวมถึงแอป RCS ที่โหลดไว้ล่วงหน้าเพื่อใช้การเชื่อมต่อผ่านดาวเทียมสำหรับส่งและรับข้อความ
ประสบการณ์การใช้งาน NFC ที่ราบรื่นยิ่งขึ้น
Android 15 致力于打造更顺畅、更可靠的感应式付款体验,同时继续支持 Android 强大的 NFC 应用生态系统。在受支持的设备上,应用可以请求 NfcAdapter
进入观察模式。在该模式下,设备会监听 NFC 读取器但不会响应 NFC 读取器,从而将应用的 NFC 服务 PollingFrame
对象发送给系统进行处理。PollingFrame
对象可用于在与 NFC 读取器首次通信之前进行身份验证,以便在许多情况下实现一键交易。
此外,应用现在可以在受支持的设备上注册过滤器,以便接收轮询循环 activity 的通知,从而与多个 NFC 感知应用顺畅运行。
บทบาทใน Wallet
Android 15 引入了一个新的钱包角色,可让您与用户首选的钱包应用更紧密地集成。此角色取代了 NFC 默认的感应式付款设置。用户可以通过导航到设置 > 应用 > 默认应用来管理 Google 钱包角色持有者。
在为付款类别中注册的 AID 路由 NFC 触碰时,可使用“钱包”角色。除非已在前台运行为同一 AID 注册的另一个应用,否则点按操作会始终转到钱包角色持有者。
此角色还可用于确定钱包“快速访问”功能块在启用后应转到的位置。当角色设置为“无”时,“快速访问”功能块不可用,并且付款类别 NFC 触碰仅会传送到前台应用。
ความปลอดภัย
Android 15 ช่วยเพิ่มความปลอดภัยของแอป ปกป้องข้อมูลของแอป และช่วยให้ผู้ใช้มีความโปร่งใสและควบคุมข้อมูลของตนเองได้มากขึ้น ดูการบรรยายเรื่องการปกป้องผู้ใช้จากภัยคุกคามบน Android จาก Google I/O เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เราทําเพื่อปรับปรุงมาตรการปกป้องผู้ใช้และปกป้องแอปของคุณจากภัยคุกคามใหม่ๆ
ผสานรวมเครื่องมือจัดการข้อมูลเข้าสู่ระบบกับการป้อนข้อความอัตโนมัติ
Starting with Android 15, developers can link specific views like username or password fields with Credential Manager requests, making it easier to provide a tailored user experience during the sign-in process. When the user focuses on one of these views, a corresponding request is sent to Credential Manager. The resulting credentials are aggregated across providers and displayed in autofill fallback UIs, such as inline suggestions or drop-down suggestions. The Jetpack androidx.credentials library is the preferred endpoint for developers to use and will soon be available to further enhance this feature in Android 15 and higher.
ผสานรวมการลงชื่อสมัครใช้และการลงชื่อเข้าใช้ด้วยการแตะเพียงครั้งเดียวกับข้อความแจ้งข้อมูลไบโอเมตริก
เครื่องมือจัดการข้อมูลเข้าสู่ระบบผสานรวมพรอมต์ข้อมูลไบโอเมตริกเข้ากับการสร้างข้อมูลเข้าสู่ระบบ และลงชื่อเข้าใช้ ทำให้ผู้ให้บริการไม่ต้องจัดการ พรอมต์ข้อมูลไบโอเมตริก ด้วยเหตุนี้ ผู้ให้บริการข้อมูลเข้าสู่ระบบจึงต้องมุ่งเน้นที่ ผลลัพธ์ของการสร้างและรับโฟลว์ ซึ่งเสริมด้วยผลลัพธ์โฟลว์ข้อมูลไบโอเมตริก กระบวนการที่ง่ายขึ้นนี้จะช่วยให้การสร้างและการเรียกข้อมูลเข้าสู่ระบบมีประสิทธิภาพและสะดวกยิ่งขึ้น
การจัดการคีย์สําหรับการเข้ารหัสจากต้นทางถึงปลายทาง
我们在 Android 15 中引入了 E2eeContactKeysManager
,它提供用于存储加密公钥的操作系统级 API,有助于 Android 应用中的端到端加密 (E2EE)。
E2eeContactKeysManager
旨在与平台通讯录应用集成,使用户能够集中管理和验证其联系人的公钥。
การตรวจสอบสิทธิ์ใน URI ของเนื้อหา
Android 15 引入了一组可对内容 URI 执行权限检查的新 API:
Context.checkContentUriPermissionFull
:这会对内容 URI 执行完整的权限检查。Activity
清单属性requireContentUriPermissionFromCaller
:这会在 activity 启动时,对提供的内容 URI 强制执行指定权限。Activity
调用方的ComponentCaller
类:这表示启动 activity 的应用。
การช่วยเหลือพิเศษ
Android 15 เพิ่มฟีเจอร์ที่ปรับปรุงการช่วยเหลือพิเศษสำหรับผู้ใช้
Better Braille
在 Android 15 中,TalkBack 可以支持通过 USB 和安全蓝牙使用 HID 标准的盲文显示屏。
此标准与鼠标和键盘使用的标准非常相似,有助于 Android 随着时间的推移而支持更广泛的盲文显示屏。
การทำให้เป็นสากล
Android 15 เพิ่มฟีเจอร์และความสามารถที่เสริมประสบการณ์ของผู้ใช้เมื่อใช้อุปกรณ์ในภาษาต่างๆ
แบบอักษร CJK ที่ปรับแต่งได้
从 Android 15 开始,中文、日语和韩语 (CJK) 语言的字体文件 NotoSansCJK 现已成为可变字体。可变字体为 CJK 语言的广告素材排版开辟了新的可能性。设计师可以探索更广泛的样式,并创建以前难以或无法实现的具有视觉冲击力的布局。
การยกตัวอักขระ
ใน Android 15 เป็นต้นไป คุณสามารถปรับข้อความให้ชิดขอบโดยใช้ระยะห่างของตัวอักษรได้โดย
ด้วย JUSTIFICATION_MODE_INTER_CHARACTER
การให้เหตุผลระหว่างคำเดิมคือ
เปิดตัวครั้งแรกใน Android 8.0 (API ระดับ 26) และระหว่างอักขระ
เหตุผลรองรับมีความสามารถที่คล้ายกันสำหรับภาษาที่ใช้
อักขระช่องว่างในการแบ่งกลุ่ม เช่น ภาษาจีน ภาษาญี่ปุ่น และอื่นๆ
การกำหนดค่าตัวแบ่งบรรทัดอัตโนมัติ
Android เริ่มรองรับการขึ้นบรรทัดใหม่ด้วยวลีสำหรับภาษาญี่ปุ่นและเกาหลีใน
Android 13 (API ระดับ 33) อย่างไรก็ตาม ขณะที่ตัวแบ่งบรรทัดแบบวลีจะปรับปรุง
ความสะดวกในการอ่านข้อความบรรทัดสั้นๆ จะทำงานได้ไม่ดีกับข้อความยาวๆ
ใน Android 15 แอปจะใช้ตัวแบ่งบรรทัดแบบวลีได้เฉพาะกับบรรทัดสั้นๆ เท่านั้น
โดยใช้ฟังก์ชัน LINE_BREAK_WORD_STYLE_AUTO
ตัวเลือก ตัวเลือกนี้จะเลือกตัวเลือกรูปแบบคำที่ดีที่สุดสำหรับข้อความ
สำหรับบรรทัดข้อความสั้นๆ จะมีการใช้ตัวแบ่งบรรทัดโดยใช้วลี โดยทำงานเหมือนเดิม
เป็น LINE_BREAK_WORD_STYLE_PHRASE
ดังที่แสดงใน
รูปภาพต่อไปนี้:
สำหรับบรรทัดข้อความที่ยาวขึ้น LINE_BREAK_WORD_STYLE_AUTO
จะใช้โอเปอเรเตอร์
รูปแบบการขึ้นบรรทัดใหม่ ทำงานเหมือนกับ
LINE_BREAK_WORD_STYLE_NONE
ดังที่แสดงใน
รูปภาพต่อไปนี้:
แบบอักษรภาษาญี่ปุ่นแบบเฮนไตกานะเพิ่มเติม
ใน Android 15 ไฟล์แบบอักษรของฮิรางานะญี่ปุ่นรุ่นเก่า (หรือที่เรียกว่า Hentaigana) จะได้รับการรวมกลุ่มไว้โดยค่าเริ่มต้น รูปทรงที่เป็นเอกลักษณ์ของตัวละคร Hentaigana สามารถเพิ่ม สำนวนของงานศิลปะหรือการออกแบบที่โดดเด่น ในขณะเดียวกันก็ช่วยให้คงความถูกต้องแม่นยำ การถ่ายทอดและความเข้าใจเกี่ยวกับเอกสารโบราณของญี่ปุ่น
VideoLAN cone Copyright (c) 1996-2010 VideoLAN. This logo or a modified version may be used or modified by anyone to refer to the VideoLAN project or any product developed by the VideoLAN team, but does not indicate endorsement by the project.
Vulkan and the Vulkan logo are registered trademarks of the Khronos Group Inc.
OpenGL is a registered trademark and the OpenGL ES logo is a trademark of Hewlett Packard Enterprise used by permission by Khronos.