Android 8.0 (API cấp 26) giới thiệu nhiều tính năng và chức năng mới cho người dùng và nhà phát triển. Tài liệu này nêu bật những điểm mới dành cho nhà phát triển.
Ngoài ra, hãy nhớ tham khảo bài viết Các thay đổi về hành vi của Android 8.0 để tìm hiểu những khía cạnh mà thay đổi của nền tảng có thể ảnh hưởng đến ứng dụng của bạn.
Trải nghiệm người dùng
Chế độ Hình trong hình
Tính năng Hình trong hình trên Android 8.0.
Android 8.0 (API cấp 26) cho phép khởi chạy các hoạt động trong chế độ hình trong hình (PIP). PIP là loại đặc biệt của chế độ nhiều cửa sổ chủ yếu được dùng để phát lại video. Ban đầu, chế độ PIP chỉ có trên Android TV; Android 8.0 cung cấp tính năng này trên các thiết bị Android khác.
Khi ở chế độ PIP, hoạt động sẽ ở trạng thái tạm dừng nhưng vẫn tiếp tục hiển thị nội dung. Vì lý do này, bạn nên đảm bảo ứng dụng của mình không tạm dừng phát trong trình xử lý onPause()
. Thay vào đó, bạn nên tạm dừng video trong onStop()
và tiếp tục phát trong onStart()
. Để biết thêm thông tin, hãy xem
Nhiều cửa sổ
Vòng đời.
Để chỉ định rằng hoạt động của bạn có thể sử dụng chế độ PIP, hãy đặt
android:supportsPictureInPicture
thành true trong tệp kê khai.
(Bắt đầu từ Android 8.0, PIP không yêu cầu
Thuộc tính tệp kê khai android:resizeableActivity
.
Tuy nhiên, bạn phải đặt android:resizeableActivity
thành "true" nếu hoạt động của bạn hỗ trợ các chế độ nhiều cửa sổ khác.)
Android 8.0 (API cấp 26) giới thiệu một đối tượng mới là PictureInPictureParams
,
mà bạn chuyển đến các phương thức PIP để chỉ định cách một hoạt động hoạt động
khi ở chế độ PIP. Đối tượng này chỉ định các thuộc tính như tỷ lệ khung hình ưu tiên của hoạt động.
Giờ đây, bạn có thể sử dụng các phương thức PIP hiện có được mô tả trong phần Thêm tính năng Hình trong hình trên tất cả thiết bị Android, chứ không chỉ trên Android TV. Ngoài ra, Android 8.0 cung cấp các phương thức sau để hỗ trợ chế độ PIP:
Activity.enterPictureInPictureMode(PictureInPictureParams args)
: Đặt hoạt động ở chế độ hình trong hình. Tỷ lệ khung hình của hoạt động và các chế độ cài đặt cấu hình khác được chỉ định bằng args. Nếu bất kỳ trường nào trong args đều trống, hệ thống sẽ sử dụng các giá trị được đặt vào lần gần nhất bạn gọiActivity.setPictureInPictureParams()
.Hoạt động được chỉ định được đặt ở một góc của màn hình; phần còn lại của màn hình được lấp đầy bằng hoạt động trước đó đã có trên màn hình. Hoạt động chuyển sang chế độ PIP sẽ chuyển sang trạng thái tạm dừng nhưng vẫn bắt đầu. Nếu người dùng nhấn vào hoạt động PIP, hệ thống sẽ hiển thị một trình đơn để người dùng tương tác; không có sự kiện chạm nào đến hoạt động này khi hoạt động ở trạng thái PIP.
-
Activity.setPictureInPictureParams()
: Cập nhật chế độ cài đặt cấu hình PIP của một hoạt động. Nếu hoạt động là hiện ở chế độ PIP, các chế độ cài đặt đã được cập nhật; điều này rất hữu ích nếu tỷ lệ khung hình của hoạt động sẽ thay đổi. Nếu hoạt động không ở chế độ PIP, các chế độ cài đặt cấu hình này được sử dụng bất kểenterPictureInPictureMode()
mà bạn gọi.
Thông báo
Trong Android 8.0 (API cấp 26), chúng tôi đã thiết kế lại thông báo để cung cấp một cách dễ dàng và nhất quán hơn để quản lý hành vi thông báo và chế độ cài đặt. Những thay đổi này bao gồm:
- Kênh thông báo: Android 8.0 ra mắt các kênh thông báo cho phép bạn tạo kênh mà người dùng có thể tuỳ chỉnh cho từng loại thông báo mà bạn muốn hiển thị. Giao diện người dùng gọi các kênh thông báo là danh mục thông báo. Để tìm hiểu cách làm để triển khai các kênh thông báo, hãy xem Quản lý kênh thông báo.
- Dấu chấm thông báo: Android 8.0 ra mắt tính năng hỗ trợ việc hiển thị dấu chấm hoặc huy hiệu, trên biểu tượng trình chạy ứng dụng. Các dấu chấm thông báo phản ánh sự hiện diện của các thông báo mà người dùng chưa đóng hoặc xử lý. Để tìm hiểu cách sử dụng dấu chấm thông báo, hãy xem phần Huy hiệu thông báo.
- Tạm hoãn: Người dùng có thể tạm hoãn thông báo khiến thông báo biến mất trong một khoảng thời gian trước khi xuất hiện lại. Thông báo sẽ xuất hiện lại với cùng mức độ quan trọng như khi xuất hiện lần đầu. Các ứng dụng có thể xoá hoặc cập nhật một thông báo bị tạm ẩn, nhưng việc cập nhật một thông báo bị tạm ẩn không gây ra mục này xuất hiện lại.
- Thời gian chờ thông báo: Bạn có thể đặt thời gian chờ khi tạo thông báo bằng
setTimeoutAfter()
. Bạn có thể sử dụng phương thức này để chỉ định thời lượng sau đó thông báo sẽ bị huỷ. Nếu cần, bạn có thể huỷ thông báo trước khi đã hết một khoảng thời gian chờ được chỉ định. - Cài đặt thông báo: Bạn có thể gọi
setSettingsText()
để đặt văn bản xuất hiện khi tạo đường liên kết đến phần cài đặt thông báo của ứng dụng từ một thông báo bằng ý địnhNotification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
. Hệ thống có thể cung cấp các tuỳ chọn bổ sung sau đây với ý định lọc các chế độ cài đặt mà ứng dụng của bạn phải hiển thị cho người dùng:EXTRA_CHANNEL_ID
,NOTIFICATION_TAG
vàNOTIFICATION_ID
. - Đóng thông báo: Người dùng có thể tự đóng thông báo và ứng dụng có thể xoá thông báo theo phương thức lập trình. Bạn có thể xác định thời điểm một thông báo bị đóng và lý do thông báo đó bị đóng bằng cách triển khai phương thức
onNotificationRemoved()
từ lớpNotificationListenerService
. - Màu nền: Bạn có thể đặt và bật màu nền cho
. Bạn chỉ nên sử dụng tính năng này trong các thông báo về
các công việc diễn ra liên tục mà người dùng có thể xem nhanh chóng. Ví dụ: bạn có thể đặt màu nền cho thông báo liên quan đến chỉ đường hoặc cuộc gọi điện thoại đang diễn ra. Bạn cũng có thể đặt
sử dụng màu nền mong muốn
setColor()
. Đang thực hiện cho phép bạn sử dụngsetColorized()
để bật việc sử dụng màu nền cho thông báo. - Kiểu nhắn tin: Trong Android 8.0, thông báo sử dụng
Màn hình lớp
MessagingStyle
thêm nội dung ở dạng thu gọn. Bạn nên sử dụng LớpMessagingStyle
cho các thông báo liên quan đến tin nhắn. Bạn cũng có thể sử dụng Phương thứcaddHistoricMessage()
để cung cấp ngữ cảnh cho một cuộc trò chuyện bằng cách thêm tin nhắn từ trước đến các thông báo liên quan đến tin nhắn.

Người dùng có thể nhấn và giữ biểu tượng trình chạy ứng dụng để xem trong Android 8.0.
Khung tự động điền
Việc tạo tài khoản, đăng nhập và giao dịch bằng thẻ tín dụng sẽ mất thời gian và dễ xảy ra lỗi. Người dùng có thể dễ dàng cảm thấy khó chịu với những ứng dụng đòi hỏi những loại ứng dụng này những công việc lặp lại.
Android 8.0 (API cấp 26) giúp điền vào các biểu mẫu, chẳng hạn như đăng nhập và biểu mẫu thẻ tín dụng, dễ dàng hơn nhờ có Khung tự động điền. Các ứng dụng mới và hiện có hoạt động với Khung tự động điền sau khi người dùng chọn tham gia tự động điền.
Bạn có thể thực hiện một số bước để tối ưu hoá cách ứng dụng hoạt động với khung này. Để biết thêm thông tin, hãy xem Tổng quan về khung tự động điền.
Phông chữ có thể tải xuống
Android 8.0 (API cấp 26) và Thư viện hỗ trợ Android 26 cho phép bạn yêu cầu phông chữ từ của nhà cung cấp thay vì gói phông chữ vào APK hoặc cho phép Tải tệp APK xuống. Tính năng này giúp giảm kích thước APK, tăng tỷ lệ cài đặt ứng dụng thành công và cho phép nhiều ứng dụng dùng chung phông chữ.
Để biết thêm thông tin về cách tải phông chữ xuống, hãy tham khảo Phông chữ có thể tải xuống.
Phông chữ trong XML
Android 8.0 (API cấp 26) giới thiệu một tính năng mới, Phông chữ ở định dạng XML (Fonts in XML), cho phép bạn dùng phông chữ làm tài nguyên. Điều này có nghĩa là bạn không cần phải gói phông chữ dưới dạng tài sản. Phông chữ được biên dịch trong tệp R
và tự động
có sẵn trong hệ thống dưới dạng tài nguyên. Sau đó, bạn có thể truy cập vào các phông chữ này bằng
trợ giúp của một loại tài nguyên mới là font
.
Thư viện hỗ trợ 26 hỗ trợ đầy đủ tính năng này trên các thiết bị chạy API phiên bản 14 trở lên.
Để biết thêm thông tin về cách sử dụng phông chữ làm tài nguyên và truy xuất phông chữ hệ thống, hãy xem phần Phông chữ ở định dạng XML.
Tự động định cỡ TextView
Android 8.0 (API cấp 26) cho phép bạn tự động đặt kích thước văn bản mở rộng hoặc thu nhỏ dựa trên kích thước của TextView. Điều này có nghĩa là dễ dàng tối ưu hoá kích thước văn bản trên nhiều màn hình hoặc với nội dung động. Để biết thêm thông tin về tính năng tự động định cỡ TextView trong Android 8.0, hãy xem phần Tự động định cỡ TextView.
Biểu tượng thích ứng
Android 8.0 (API cấp 26) giới thiệu biểu tượng trình chạy thích ứng. Biểu tượng thích ứng hỗ trợ hiệu ứng hình ảnh và có thể hiển thị nhiều hình dạng trên nhiều mẫu thiết bị. Để tìm hiểu cách tạo biểu tượng thích ứng, hãy xem hướng dẫn về Biểu tượng thích ứng.
Quản lý màu sắc
Giờ đây, các nhà phát triển ứng dụng hình ảnh trên Android có thể tận dụng các thiết bị mới có màn hình có khả năng hiển thị màu sắc rộng. Để hiển thị hình ảnh có gam màu rộng, ứng dụng cần bật một cờ trong tệp kê khai (cho mỗi hoạt động) và tải bitmap bằng hồ sơ màu rộng được nhúng (AdobeRGB, Pro Photo RGB, DCI-P3, v.v.).
API WebView
Android 8.0 cung cấp một số API để giúp bạn quản lý các đối tượng WebView
hiển thị nội dung web trong ứng dụng. Các API này giúp cải thiện độ ổn định và bảo mật của ứng dụng, bao gồm:
- API phiên bản
- API Duyệt web an toàn của Google
- API Xử lý việc chấm dứt
- API Tầm quan trọng của trình kết xuất
Để tìm hiểu thêm về cách sử dụng các API này, hãy xem Quản lý WebView.
Lớp WebView
hiện bao gồm một Safe Browsing API để tăng cường bảo mật
duyệt web. Để biết thêm thông tin, hãy xem
API Duyệt web an toàn của Google.
Ghim lối tắt và tiện ích
Android 8.0 (API cấp 26) giới thiệu tính năng ghim lối tắt và tiện ích trong ứng dụng. Trong ứng dụng, bạn có thể tạo lối tắt và tiện ích được ghim cho các trình chạy được hỗ trợ, tuỳ thuộc vào sự cho phép của người dùng.
Để biết thêm thông tin, hãy xem Ghim lối tắt và tiện ích hướng dẫn về tính năng.
Tỷ lệ khung hình tối đa của màn hình
Android 8.0 (API cấp 26) mang đến những thay đổi về cách định cấu hình tỷ lệ khung hình tối đa của ứng dụng.
Trước tiên, Android 8.0 giới thiệu thuộc tính maxAspectRatio mà bạn có thể sử dụng để đặt tỷ lệ khung hình tối đa của ứng dụng. Ngoài ra, trong Android 8.0 trở lên, tỷ lệ khung hình tối đa mặc định của ứng dụng là tỷ lệ khung hình gốc của thiết bị mà ứng dụng đang chạy.
Để biết thêm thông tin về cách khai báo tỷ lệ khung hình tối đa, hãy xem phần Hỗ trợ nhiều màn hình.
Hỗ trợ nhiều màn hình
Kể từ Android 8.0 (API cấp 26), nền tảng này sẽ hỗ trợ nâng cao cho nhiều màn hình. Nếu một hoạt động hỗ trợ chế độ nhiều cửa sổ và đang chạy trên một thiết bị có nhiều màn hình, người dùng có thể di chuyển hoạt động này từ màn hình này sang màn hình khác. Khi khởi chạy một hoạt động, ứng dụng có thể chỉ định màn hình nào sẽ chạy hoạt động đó.
Lưu ý: Nếu một hoạt động hỗ trợ chế độ nhiều cửa sổ, Android 8.0 sẽ tự động bật nhiều màn hình cho hoạt động đó. Bạn nên kiểm thử ứng dụng để đảm bảo ứng dụng hoạt động đầy đủ trong môi trường nhiều màn hình.
Tại mỗi thời điểm, chỉ một hoạt động có thể ở trạng thái tiếp tục, ngay cả khi ứng dụng có nhiều màn hình. Hoạt động có tiêu điểm đang ở trạng thái đã tiếp tục; tất cả các hoạt động hiển thị khác đều bị tạm dừng, nhưng không dừng lại. Để biết thêm thông tin về vòng đời hoạt động khi có nhiều hoạt động hiển thị, hãy xem phần Vòng đời nhiều cửa sổ.
Khi người dùng di chuyển một hoạt động từ màn hình này sang màn hình khác, hệ thống sẽ đổi kích thước hoạt động và đưa ra các thay đổi về thời gian chạy nếu cần. Hoạt động của bạn có thể tự xử lý thay đổi về cấu hình hoặc có thể cho phép hệ thống huỷ quá trình chứa hoạt động của bạn và tạo lại quá trình đó bằng các phương diện mới. Để biết thêm thông tin, hãy xem Cấu hình xử lý Thay đổi.
ActivityOptions
cung cấp 2 phương thức mới để hỗ trợ
nhiều màn hình:
setLaunchDisplayId()
- Chỉ định màn hình sẽ hiển thị hoạt động khi hoạt động đó được khởi chạy.
getLaunchDisplayId()
- Trả về màn hình khởi chạy hiện tại của hoạt động.
Vỏ adb được mở rộng để hỗ trợ nhiều màn hình.
Giờ đây, bạn có thể dùng lệnh shell start
để chạy một hoạt động và chỉ định màn hình mục tiêu của hoạt động:
adb shell start <activity_name> --display <display_id>
Khoảng đệm và lề bố cục hợp nhất
Android 8.0 (API cấp 26) giúp bạn dễ dàng chỉ định tình huống mà các cạnh đối diện
của một phần tử View
sử dụng cùng một lề hoặc khoảng đệm.
Cụ thể, bạn hiện có thể sử dụng các thuộc tính sau trong tệp XML bố cục của mình
tệp:
layout_marginVertical
, xác địnhlayout_marginTop
vàlayout_marginBottom
cùng một lúc.-
layout_marginHorizontal
, xác địnhlayout_marginLeft
vàlayout_marginRight
cùng lúc. -
paddingVertical
, xác địnhpaddingTop
vàpaddingBottom
cùng lúc. paddingHorizontal
, xác địnhpaddingLeft
vàpaddingRight
cùng một lúc.
Lưu ý: Nếu bạn tuỳ chỉnh logic của ứng dụng để
hỗ trợ các định dạng khác nhau
ngôn ngữ và văn hoá, bao gồm cả hướng văn bản, xin lưu ý rằng
không ảnh hưởng đến giá trị của
layout_marginStart
!
layout_marginEnd
,
paddingStart
hoặc
paddingEnd
. Bạn có thể tự đặt các giá trị này, ngoài việc
các thuộc tính bố cục dọc và ngang mới để tạo hành vi bố cục
phụ thuộc vào hướng văn bản.
Chụp con trỏ
Một số ứng dụng, chẳng hạn như trò chơi, máy tính từ xa và ứng dụng ảo hoá, hưởng lợi từ việc kiểm soát con trỏ chuột. Chụp con trỏ là một tính năng mới trong Android 8.0 (API cấp 26) cung cấp khả năng kiểm soát đó bằng cách gửi tất cả các sự kiện chuột vào chế độ xem tập trung trong ứng dụng của bạn.
Kể từ Android 8.0, View
trong ứng dụng của bạn có thể yêu cầu chụp con trỏ và xác định trình nghe để xử lý các sự kiện con trỏ đã chụp. Chiến lược phát hành đĩa đơn
con trỏ chuột bị ẩn khi ở chế độ này. Khung hiển thị có thể giải phóng chụp con trỏ
khi không cần thông tin về chuột nữa. Hệ thống cũng có thể phát hành
thu thập con trỏ khi khung hiển thị mất tiêu điểm (ví dụ: khi người dùng mở)
một ứng dụng khác.
Để biết thông tin về cách sử dụng tính năng này trong ứng dụng, hãy xem phần Ghi lại con trỏ.
Danh mục ứng dụng
Android 8.0 (API cấp 26) cho phép mỗi ứng dụng khai báo một danh mục phù hợp
vào, khi phù hợp. Các danh mục này được dùng để nhóm các ứng dụng có mục đích hoặc chức năng tương tự với nhau khi trình bày cho người dùng, chẳng hạn như trong Mức sử dụng dữ liệu, Mức sử dụng pin hoặc Mức sử dụng bộ nhớ. Bạn có thể xác định danh mục cho ứng dụng bằng cách đặt thuộc tính android:appCategory
trong thẻ tệp kê khai <application>
.
Trình chạy Android TV
Android 8.0 (API cấp 26) bao gồm một giao diện mới tập trung vào nội dung, Trải nghiệm trên màn hình chính của Android TV, hỗ trợ trình mô phỏng Android TV và hình ảnh thiết bị Nexus Player cho Android 8.0. Màn hình chính mới sắp xếp nội dung video trong các hàng tương ứng với các kênh, mỗi kênh được điền bằng các chương trình bởi một ứng dụng trên hệ thống. Ứng dụng có thể phát hành nhiều kênh và người dùng có thể định cấu hình những kênh mà họ muốn xem trên màn hình chính. Màn hình chính của Android TV cũng có hàng Watch Next (Xem tiếp theo). Hàng này được điền sẵn các chương trình từ các ứng dụng, dựa trên thói quen xem của người dùng. Ứng dụng cũng có thể cung cấp bản xem trước video. Bản xem trước này sẽ tự động phát khi người dùng tập trung vào một chương trình. Các API để điền sẵn kênh và chương trình là một phần của API TvProvider, được phân phối dưới dạng mô-đun Thư viện hỗ trợ Android với Android 8.0.
Nhóm hoạt ảnh
Kể từ Android 8.0 (API cấp 26), API AnimatorSet
hiện hỗ trợ tính năng tua và phát ngược. Tính năng tua cho phép bạn đặt vị trí của ảnh động thành một thời điểm cụ thể. Tính năng phát ngược sẽ hữu ích nếu ứng dụng của bạn có ảnh động cho các thao tác có thể huỷ. Thay vì xác định hai tập hợp ảnh động riêng biệt, bạn có thể phát cùng một tập hợp theo chiều ngược lại.
Phương thức nhập và điều hướng
Cụm điều hướng trên bàn phím
Nếu một hoạt động trong ứng dụng của bạn sử dụng một hệ phân cấp khung hiển thị phức tạp, chẳng hạn như cấu hình trong Hình 2, cân nhắc việc sắp xếp các nhóm thành phần giao diện người dùng thành nhiều cụm để dễ dàng hơn điều hướng bằng bàn phím giữa các số liệu. Người dùng có thể nhấn tổ hợp phím Meta+Tab hoặc Search+Tab trên các thiết bị Chromebook để di chuyển từ cụm này sang cụm khác. Ví dụ hay về các cụm đó bao gồm: bảng điều khiển bên, thanh điều hướng, khu vực nội dung chính và các phần tử có thể chứa nhiều phần tử con.

Cách tạo phần tử View
hoặc ViewGroup
một cụm, hãy đặt
Thuộc tính android:keyboardNavigationCluster
cho
true
trong tệp XML bố cục của phần tử, hoặc truyền true
vào setKeyboardNavigationCluster()
trong logic giao diện người dùng của ứng dụng.
Lưu ý: Các cụm không được lồng ghép mặc dù các cụm không được lồng
có thể xuất hiện ở các cấp khác nhau trong hệ thống phân cấp. Nếu bạn cố gắng
lồng các cụm trên cùng, khung này chỉ xử lý những cụm trên cùng
Phần tử ViewGroup
dưới dạng một cụm.
Trên các thiết bị có màn hình cảm ứng, bạn có thể đặt phần tử android:touchscreenBlocksFocus
của đối tượng ViewGroup
được chỉ định cụm thành true
để cho phép chỉ điều hướng vào và ra khỏi cụm đó. Nếu bạn áp dụng cấu hình này cho một cụm, người dùng không thể sử dụng phím Tab hoặc phím mũi tên để di chuyển vào hoặc ra khỏi cụm; thay vào đó, họ phải nhấn tổ hợp phím điều hướng cụm.
Xem tiêu điểm mặc định
Trong Android 8.0 (API cấp 26), bạn có thể chỉ định View
cần
nhận tiêu điểm sau khi một hoạt động (tái) được tiếp tục và người dùng nhấn một
phím điều hướng trên bàn phím, chẳng hạn như phím tab. Để áp dụng chế độ cài đặt "được lấy tiêu điểm theo mặc định" này, hãy đặt thuộc tính android:focusedByDefault
của phần tử View
thành true
trong tệp XML bố cục chứa phần tử giao diện người dùng hoặc truyền true
vào setFocusedByDefault()
trong logic giao diện người dùng của ứng dụng.
Đầu ra bằng giọng nói
Các hoạt động và dịch vụ có thể sử dụng các thực thể của TextToSpeech
để đọc và phát âm nội dung. Tính đến
Android 8.0 (API cấp 26), ứng dụng của bạn có thể lấy thông tin thời gian chính xác hơn
về thời điểm một công cụ chuyển văn bản sang lời nói bắt đầu nói các từ tổng hợp riêng lẻ,
miễn là công cụ cung cấp thông tin này. Bạn có thể dùng chức năng này
để thu hút sự chú ý vào những từ cụ thể khi công cụ chuyển văn bản sang lời nói nói
chúng.
Để sử dụng các điểm cải tiến này cho công cụ chuyển văn bản sang lời nói trong ứng dụng, hãy đăng ký một thực thể của UtteranceProgressListener
. Là một phần của
quá trình đăng ký, bao gồm một trình xử lý cho
onRangeStart()
.
Công cụ chuyển văn bản sang lời nói gọi rangeStart()
để ghi lại thời điểm dự kiến phát âm thanh của một phạm vi văn bản cụ thể. Khi âm thanh cho dải văn bản đó bắt đầu phát,
onRangeStart()
thực thi phương thức. Sau đó, ứng dụng của bạn có thể phản hồi lệnh gọi lại này, chẳng hạn như bằng cách làm nổi bật phạm vi văn bản liên kết với câu lệnh.
Để biết thêm thông tin về cách theo dõi tiến trình phát của công cụ chuyển văn bản sang lời nói, hãy xem tài liệu tham khảo về lớp UtteranceProgressListener
.
Hệ thống
Trình phát hiện StrictMode mới
Android 8.0 (API cấp 26) thêm 3 trình phát hiện StrictMode mới để giúp xác định các lỗi tiềm ẩn trong ứng dụng:
detectUnbufferedIo()
sẽ phát hiện khi ứng dụng của bạn đọc hoặc ghi dữ liệu mà không cần lưu vào bộ đệm. Điều này có thể ảnh hưởng đáng kể hiệu suất.detectContentUriWithoutPermission()
sẽ phát hiện thời điểm ứng dụng của bạn vô tình quên cấp quyền cho một ứng dụng khác khi bắt đầu một Hoạt động bên ngoài ứng dụng của bạn.detectUntaggedSockets()
sẽ phát hiện thời điểm ứng dụng của bạn thực hiện lưu lượng truy cập mạng mà không sử dụngsetThreadStatsTag(int)
để gắn thẻ lưu lượng truy cập cho mục đích gỡ lỗi.
Dữ liệu đã lưu vào bộ nhớ đệm
Android 8.0 (API cấp 26) cung cấp hướng dẫn và hành vi tốt hơn về dữ liệu được lưu vào bộ nhớ đệm. Giờ đây, mỗi ứng dụng sẽ được cấp hạn mức dung lượng ổ đĩa cho dữ liệu đã lưu vào bộ nhớ đệm, như được getCacheQuotaBytes(UUID)
trả về.
Khi cần giải phóng dung lượng ổ đĩa, hệ thống sẽ bắt đầu bằng cách xoá các tệp đã lưu vào bộ nhớ đệm khỏi ứng dụng vượt quá hạn mức phân bổ của họ. Do đó, nếu bạn lưu giữ dữ liệu đã lưu vào bộ nhớ đệm trong hạn mức phân bổ, các tệp được lưu vào bộ nhớ đệm của bạn sẽ nằm trong số những tệp sau cùng trên hệ thống bị xoá khi nếu cần. Khi quyết định xoá tệp nào trong bộ nhớ đệm bên trong ứng dụng, hệ thống sẽ xem xét các tệp cũ nhất trước (được xác định theo thời gian sửa đổi).
Ngoài ra, bạn cũng có thể bật 2 hành vi mới trên cơ sở mỗi thư mục để kiểm soát cách hệ thống giải phóng dữ liệu được lưu vào bộ nhớ đệm:
- Bạn có thể dùng
StorageManager.setCacheBehaviorAtomic()
để cho biết rằng một thư mục và tất cả nội dung của thư mục đó sẽ bị xoá dưới dạng một đơn vị nguyên tử. - Có thể dùng
setCacheBehaviorTombstone(File, boolean)
để cho biết rằng thay vì xoá các tệp bên trong thư mục, chúng nên được cắt ngắn thành 0 byte trong để giữ nguyên tệp trống.
Cuối cùng, khi bạn cần phân bổ dung lượng ổ đĩa cho các tệp lớn, hãy cân nhắc sử dụng API allocateBytes(FileDescriptor, long)
mới. API này sẽ tự động xoá các tệp lưu vào bộ nhớ đệm thuộc về các ứng dụng khác (nếu cần) để đáp ứng yêu cầu của bạn. Khi quyết định xem thiết bị có đủ dung lượng ổ đĩa để lưu trữ dữ liệu mới hay không, hãy gọi getAllocatableBytes(UUID)
thay vì sử dụng getUsableSpace()
, vì phương thức trước sẽ xem xét mọi dữ liệu được lưu vào bộ nhớ đệm mà hệ thống sẵn sàng xoá thay mặt cho bạn.
Phân trang cho trình cung cấp nội dung
Chúng tôi đã cập nhật các trình cung cấp nội dung để bao gồm hỗ trợ tải tệp tập dữ liệu một trang mỗi lần. Ví dụ: ứng dụng ảnh có hàng nghìn hình ảnh có thể truy vấn một tập hợp con dữ liệu cụ thể hiển thị trên một trang. Mỗi trang kết quả do trình cung cấp nội dung trả về được biểu thị bằng một Con trỏ . Cả ứng dụng và nhà cung cấp đều phải triển khai tính năng phân trang để tận dụng tính năng này.
Để biết thông tin chi tiết về những thay đổi đối với trình cung cấp nội dung, hãy xem
ContentProvider
và
ContentProviderClient
.
Yêu cầu làm mới nội dung
ContentProvider
và
Hiện tại, mỗi lớp ContentResolver
bao gồm một
refresh()
, giúp khách hàng dễ dàng biết được liệu
thông tin mà họ yêu cầu là thông tin mới nhất.
Bạn có thể thêm logic làm mới nội dung tuỳ chỉnh bằng cách mở rộng
ContentProvider
. Hãy đảm bảo rằng bạn đã ghi đè
Phương thức refresh()
để trả về
true
, cho khách hàng của nhà cung cấp biết rằng bạn đã cố gắng
để tự làm mới dữ liệu.
Ứng dụng khách của bạn có thể yêu cầu nội dung được làm mới một cách rõ ràng bằng cách gọi một
phương thức khác, còn được gọi là
refresh()
. Khi gọi phương thức này, hãy truyền URI của dữ liệu cần làm mới.
Lưu ý: Vì có thể bạn đang yêu cầu dữ liệu qua mạng, nên bạn chỉ nên gọi refresh()
từ phía máy khách khi có dấu hiệu rõ ràng cho thấy nội dung đã lỗi thời.
Lý do phổ biến nhất để thực hiện loại hình làm mới nội dung này là để phản hồi
vuốt để làm mới
cử chỉ, yêu cầu rõ ràng giao diện người dùng hiện tại để hiển thị nội dung cập nhật.
Các điểm cải tiến về JobScheduler
Android 8.0 (API cấp 26) giới thiệu một số điểm cải tiến cho JobScheduler
. Những điểm cải tiến này giúp ứng dụng của bạn dễ dàng tuân thủ các giới hạn mới về việc thực thi ở chế độ nền, vì thường thì bạn có thể sử dụng các công việc theo lịch để thay thế các dịch vụ ở chế độ nền hiện bị hạn chế hoặc các broadcast receiver ngầm ẩn.
Nội dung cập nhật cho JobScheduler
bao gồm:
-
Giờ đây, bạn có thể liên kết hàng đợi công việc với một công việc được lên lịch. Để thêm một mục công việc vào hàng đợi của công việc, hãy gọi
JobScheduler.enqueue()
. Khi đang chạy, công việc có thể đưa công việc đang chờ xử lý ra khỏi hàng đợi và xử lý. Chức năng này xử lý nhiều trường hợp sử dụng mà trước đây lẽ ra phải có để bắt đầu một dịch vụ nền, các dịch vụ cụ thể triển khaiIntentService
. -
Android
Thư viện hỗ trợ 26.0.0 giới thiệu một lớp
JobIntentService
mới, cung cấp cùng một lớp chức năng dưới dạngIntentService
nhưng sử dụng công việc thay vì khi chạy trên Android 8.0 (API cấp 26) trở lên. -
Giờ đây, bạn có thể gọi
JobInfo.Builder.setClipData()
để liên kếtClipData
với một công việc. Tuỳ chọn này cho phép bạn liên kết các quyền cấp URI với một công việc, tương tự như cách các quyền này có thể được truyền đếnContext.startService()
. Bạn cũng có thể dùng tính năng cấp quyền URI cho ý định vào hàng đợi công việc. -
Các công việc đã lên lịch hiện hỗ trợ một số quy tắc ràng buộc mới:
JobInfo.isRequireStorageNotLow()
- Công việc không chạy nếu dung lượng lưu trữ trống của thiết bị sắp hết.
JobInfo.isRequireBatteryNotLow()
- Công việc sẽ không chạy nếu mức pin ở mức hoặc dưới ngưỡng quan trọng; đây là mức mà thiết bị hiển thị hộp thoại hệ thống Cảnh báo pin yếu.
NETWORK_TYPE_METERED
- Công việc yêu cầu kết nối mạng có đo lượng dữ liệu, giống như hầu hết các gói dữ liệu di động.
Kho dữ liệu tuỳ chỉnh
Android 8.0 (API cấp 26) cho phép bạn cung cấp kho dữ liệu tuỳ chỉnh theo lựa chọn ưu tiên của mình. Điều này có thể hữu ích nếu ứng dụng của bạn lưu trữ các lựa chọn ưu tiên trên một đám mây hay cơ sở dữ liệu cục bộ, hoặc nếu các lựa chọn ưu tiên đó dành riêng cho từng thiết bị. Để biết thêm thông tin về triển khai kho dữ liệu, hãy tham khảo Lưu trữ dữ liệu tuỳ chỉnh.
Cải tiến nội dung đa phương tiện
Bộ định hình khối lượng
Có một lớp VolumeShaper
mới. Sử dụng
để thực hiện các chuyển đổi âm lượng ngắn tự động như rõ dần, mờ dần và làm mờ chéo.
Xem phần Điều khiển biên độ bằng VolumeShaper
để tìm hiểu thêm.
Cải thiện quyền phát âm thanh
Các ứng dụng âm thanh chia sẻ đầu ra âm thanh trên thiết bị bằng cách yêu cầu và từ bỏ quyền phát âm thanh.
Ứng dụng xử lý các thay đổi về tiêu điểm bằng cách bắt đầu hoặc dừng phát, hoặc giảm âm lượng.
Có một lớp AudioFocusRequest
mới. Dùng lớp này làm tham số của
requestAudioFocus()
,
các ứng dụng có các tính năng mới khi xử lý các thay đổi về quyền phát âm thanh:
tự động giảm âm thanh và
chậm hơn lấy tiêu điểm.
Chỉ số về nội dung nghe nhìn
Phương thức getMetrics()
mới trả về PersistableBundle
đối tượng chứa cấu hình
và thông tin về hiệu suất, được biểu thị dưới dạng bản đồ các thuộc tính và giá trị.
Phương thức getMetrics()
được xác định cho các lớp nội dung nghe nhìn sau:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
Các chỉ số được thu thập riêng cho từng thực thể và tồn tại trong suốt thời gian hoạt động của thực thể đó. Nếu không có chỉ số nào, phương thức này sẽ trả về giá trị rỗng. Các chỉ số thực tế được trả về tuỳ thuộc vào lớp.
MediaPlayer
Kể từ Android 8.0 (API cấp 26) MediaPlayer có thể phát Được bảo vệ bằng DRM material và nội dung nghe nhìn đã mã hoá ở cấp mẫu HLS.
Android 8.0 ra mắt quy trình nạp chồng mới
Lệnh seekTo()
cung cấp thông tin chi tiết
điều khiển khi tua đến một khung hình. Phương thức này bao gồm một tham số thứ hai chỉ định chế độ tua:
SEEK_PREVIOUS_SYNC
di chuyển vị trí nội dung nghe nhìn đến khung đồng bộ hoá (hoặc khoá) liên kết với một nguồn dữ liệu nằm ngay trước hoặc tại thời điểm đã cho.SEEK_NEXT_SYNC
di chuyển vị trí nội dung nghe nhìn đến một khung đồng bộ hoá (hoặc phím) được liên kết bằng một nguồn dữ liệu ngay sau hoặc tại một thời điểm nhất định.SEEK_CLOSEST_SYNC
di chuyển vị trí nội dung nghe nhìn đến khung đồng bộ hoá (hoặc khoá) liên kết với nguồn dữ liệu gần nhất hoặc tại thời điểm nhất định.SEEK_CLOSEST
di chuyển vị trí nội dung nghe nhìn đến một khung (không nhất thiết là khung đồng bộ hoá hoặc khung chính) liên kết với một nguồn dữ liệu nằm gần nhất hoặc tại thời điểm nhất định.
Khi tua liên tục, các ứng dụng nên sử dụng bất kỳ chế độ SEEK_
nào thay vì SEEK_CLOSEST
. Chế độ này chạy tương đối chậm hơn nhưng có thể chính xác hơn.
MediaRecorder
- MediaRecorder hiện hỗ trợ định dạng MPEG2_TS rất hữu ích cho việc truyền trực tuyến:
Kotlin
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
Java
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
MediaMuxer
hiện có thể xử lý số lượng luồng âm thanh và video bất kỳ. Bạn không còn bị giới hạn cho một bản âm thanh và/hoặc một bản video. Sử dụngaddTrack()
để kết hợp bao nhiêu bản nhạc tuỳ thích.MediaMuxer
cũng có thể thêm một hoặc nhiều kênh siêu dữ liệu chứa nội dung do người dùng xác định trên mỗi khung hình của bạn. Ứng dụng của bạn xác định định dạng của siêu dữ liệu. Chiến lược phát hành đĩa đơn bản siêu dữ liệu chỉ được hỗ trợ cho vùng chứa MP4.
Siêu dữ liệu có thể hữu ích cho việc xử lý ngoại tuyến. Ví dụ: tín hiệu con quay hồi chuyển từ cảm biến có thể được sử dụng để ổn định video.
Khi thêm một kênh siêu dữ liệu, định dạng MIME của kênh đó phải bắt đầu bằng tiền tố "application/". Việc ghi siêu dữ liệu cũng giống như ghi dữ liệu video/âm thanh, ngoại trừ
rằng dữ liệu không phải từ MediaCodec
. Thay vào đó, ứng dụng sẽ truyền một ByteBuffer
có dấu thời gian liên kết đến phương thức writeSampleData()
.
Dấu thời gian phải có cùng cơ sở thời gian với các bản âm thanh và video.
Tệp MP4 được tạo sử dụng TextMetaDataSampleEntry
được xác định trong phần 12.3.3.2 của ISOBMFF để báo hiệu định dạng mime của siêu dữ liệu. Khi sử dụng MediaExtractor
để trích xuất tệp có bản theo dõi siêu dữ liệu, mime
định dạng của siêu dữ liệu sẽ được trích xuất vào MediaFormat
.
Cải thiện quyền truy cập vào tệp nội dung nghe nhìn
Chiến lược phát hành đĩa đơn
Khung truy cập bộ nhớ (SAF) cho phép các ứng dụng hiển thị
DocumentsProvider
, có thể cung cấp quyền truy cập vào tệp
trong nguồn dữ liệu cho các ứng dụng khác. Trên thực tế, một
nhà cung cấp tài liệu thậm chí có thể cung cấp quyền truy cập vào các tệp
nằm trên bộ nhớ mạng hoặc sử dụng một giao thức như
Giao thức truyền nội dung nghe nhìn (MTP).
Tuy nhiên, việc truy cập vào các tệp phương tiện lớn từ một nguồn dữ liệu từ xa sẽ gây ra một số thách thức:
- Trình phát nội dung đa phương tiện yêu cầu quyền truy cập có thể tìm kiếm vào tệp từ nhà cung cấp tài liệu. Trong trường hợp tệp phương tiện lớn nằm trên một nguồn dữ liệu từ xa, thì trình cung cấp tài liệu phải tìm nạp trước tất cả dữ liệu và tạo một chỉ số mô tả tệp tổng quan nhanh. Trình phát nội dung đa phương tiện không thể phát tệp nếu không có tệp đó do đó, việc phát lại không thể bắt đầu cho đến khi trình cung cấp tài liệu kết thúc đang tải tệp xuống.
- Trình quản lý bộ sưu tập nội dung nghe nhìn, chẳng hạn như ứng dụng ảnh, phải truyền tải hàng loạt truy cập URI để truy cập nội dung nghe nhìn được lưu trữ trên thẻ SD bên ngoài thông qua . Mẫu truy cập này khiến các thao tác hàng loạt trên nội dung nghe nhìn (chẳng hạn như di chuyển, sao chép và xoá) khá chậm.
- Trình quản lý bộ sưu tập nội dung nghe nhìn không thể xác định vị trí của tài liệu dựa trên URI. Điều này gây khó khăn cho các loại ứng dụng này trong việc cho phép người dùng lựa chọn nơi lưu tệp đa phương tiện.
Android 8.0 giải quyết từng thách thức này bằng cách cải thiện Quyền truy cập vào bộ nhớ Khung.
Nhà cung cấp tài liệu tuỳ chỉnh
Kể từ Android 8.0, Khung truy cập bộ nhớ cho phép nhà cung cấp tài liệu tuỳ chỉnh tạo chỉ số mô tả tệp có thể tìm kiếm cho các tệp nằm trong nguồn dữ liệu từ xa. SAF có thể mở một tệp để lấy chỉ số mô tả tệp gốc có thể tìm kiếm. Sau đó, SAF sẽ phân phối các yêu cầu về byte riêng biệt cho nhà cung cấp tài liệu. Tính năng này cho phép nhà cung cấp tài liệu trả về phạm vi chính xác các byte mà một ứng dụng trình phát nội dung đa phương tiện đã yêu cầu thay vì lưu toàn bộ vào bộ nhớ đệm tệp trước.
Để sử dụng tính năng này, bạn cần gọi hàm mới
StorageManager.openProxyFileDescriptor()
. Chiến lược phát hành đĩa đơn
Phương thức openProxyFileDescriptor()
chấp nhận một đối tượng ProxyFileDescriptorCallback
làm lệnh gọi lại. SAF yêu cầu
lệnh gọi lại bất cứ khi nào một ứng dụng khách thực hiện các thao tác đối với tệp trên
chỉ số mô tả tệp được trả về từ nhà cung cấp tài liệu.
Quyền truy cập trực tiếp vào tài liệu
Kể từ Android 8.0 (API cấp 26), bạn có thể sử dụng phương thức getDocumentUri()
để lấy một URI tham chiếu đến cùng một tài liệu với mediaUri
đã cho.
Tuy nhiên, vì URI trả về được hỗ trợ bởi
DocumentsProvider
, người quản lý bộ sưu tập đa phương tiện có thể truy cập
tài liệu đó mà không phải truyền tải qua cây của các thư mục có phạm vi.
Do đó, trình quản lý nội dung nghe nhìn có thể thực hiện các thao tác trên tệp của tài liệu nhanh hơn đáng kể.
Thận trọng: Phương thức getDocumentUri()
chỉ xác định các tệp nội dung nghe nhìn; nó không cấp cho ứng dụng
quyền truy cập vào các tệp đó. Để tìm hiểu thêm về cách yêu cầu quyền truy cập vào các tệp phương tiện, hãy xem tài liệu tham khảo.
Đường dẫn đến tài liệu
Khi sử dụng Khung truy cập bộ nhớ trong Android 8.0 (API cấp 26), bạn có thể sử dụng
Phương thức findDocumentPath()
, có trong cả hai
DocumentsContract
và
DocumentsProvider
các lớp khác nhau, để xác định đường dẫn từ gốc của hệ thống tệp dựa vào
Mã nhận dạng. Phương thức này trả về đường dẫn này trong một đối tượng DocumentsContract.Path
. Trong trường hợp một tệp
hệ thống có nhiều đường dẫn xác định đến cùng một tài liệu, thì phương thức này sẽ trả về
được sử dụng thường xuyên nhất để truy cập vào tài liệu có ID đã cho.
Chức năng này đặc biệt hữu ích trong các trường hợp sau:
- Ứng dụng của bạn sử dụng hộp thoại "save as" (lưu dưới dạng) hiển thị vị trí của một tài liệu cụ thể.
- Ứng dụng của bạn hiển thị các thư mục ở chế độ xem kết quả tìm kiếm và phải tải thư mục con các tài liệu nằm trong một thư mục cụ thể nếu người dùng chọn .
Lưu ý: Nếu ứng dụng của bạn chỉ có quyền truy cập vào một số tài liệu trong đường dẫn, thì giá trị trả về của findDocumentPath()
chỉ bao gồm các thư mục và tài liệu mà ứng dụng của bạn có thể truy cập.
Đang theo dõi việc phát âm thanh
Dịch vụ hệ thống AudioManager
duy trì danh sách các đối tượng AudioPlaybackConfiguration
đang hoạt động, trong đó mỗi đối tượng chứa thông tin về một phiên phát âm thanh cụ thể. Ứng dụng của bạn có thể
truy xuất tập hợp các cấu hình hiện đang hoạt động bằng cách gọi
getActivePlaybackConfigurations()
.
Kể từ Android 8.0 (API cấp 26), bạn có thể đăng ký một lệnh gọi lại để thông báo cho
ứng dụng của bạn khi một hoặc nhiều
Các đối tượng AudioPlaybackConfiguration
đã thay đổi. Để làm như vậy,
gọi registerAudioPlaybackCallback()
, truyền vào một thực thể của
AudioManager.AudioPlaybackCallback
. Lớp AudioManager.AudioPlaybackCallback
chứa phương thức onPlaybackConfigChanged()
mà hệ thống gọi khi cấu hình phát âm thanh thay đổi.
Khả năng kết nối
Wi-Fi Aware
Android 8.0 (API cấp 26) bổ sung khả năng hỗ trợ tính năng Nhận biết Wi-Fi dựa trên Neighbor Quy cách kết nối mạng nhận biết (NAN). Trên các thiết bị có phần cứng Wi-Fi Aware thích hợp, các ứng dụng và thiết bị ở gần có thể khám phá và giao tiếp qua Wi-Fi mà không cần điểm truy cập Internet. Chúng tôi đang hợp tác với các đối tác phần cứng để đưa công nghệ Wi-Fi Aware vào các thiết bị sớm nhất có thể. Để thông tin về cách tích hợp tính năng Nhận biết Wi-Fi vào ứng dụng của bạn, hãy xem phần Nhận biết Wi-Fi.
Bluetooth
Android 8.0 (API cấp 26) làm phong phú thêm tính năng hỗ trợ Bluetooth của nền tảng này bằng cách bổ sung: tính năng:
- Hỗ trợ chuẩn AVRCP 1.4, cho phép duyệt xem thư viện bài hát.
- Hỗ trợ tiêu chuẩn Bluetooth năng lượng thấp (BLE) 5.0.
- Tích hợp bộ mã hoá và giải mã LDAC Sony vào ngăn xếp Bluetooth.
Ghép nối thiết bị đồng hành
Android 8.0 (API cấp 26) cung cấp các API cho phép bạn tuỳ chỉnh hộp thoại yêu cầu ghép nối khi cố gắng ghép nối với các thiết bị đồng hành qua Bluetooth, BLE và Wi-Fi. Để biết thêm thông tin, hãy xem phần Ghép nối thiết bị đồng hành.
Để biết thêm thông tin về cách sử dụng Bluetooth trên Android, hãy xem hướng dẫn về Bluetooth. Để thay đổi đối với Bluetooth dành riêng cho Android 8.0 (API cấp 26), hãy xem Phần Bluetooth của phần Trang Các thay đổi về hành vi trên Android 8.0.
Chia sẻ
Chia sẻ thông minh
Android 8.0 (API cấp 26) tìm hiểu về các lựa chọn ưu tiên chia sẻ được cá nhân hoá của người dùng và hiểu rõ hơn về từng loại nội dung, ứng dụng nào phù hợp để chia sẻ. Ví dụ: nếu người dùng chụp ảnh biên nhận, Android 8.0 có thể đề xuất một ứng dụng theo dõi chi phí; nếu người dùng tự chụp ảnh chân dung, một mạng xã hội có thể xử lý hình ảnh tốt hơn. Android 8.0 tự động học tất cả những điều này theo đánh giá của người dùng các lựa chọn ưu tiên được cá nhân hoá.
Tính năng chia sẻ thông minh hoạt động với các loại nội dung không phải image
, chẳng hạn như
audio
, video
, text
, URL
,
và hơn thế nữa
Để bật tính năng Chia sẻ thông minh, hãy thêm ArrayList
gồm tối đa 3 chú thích chuỗi vào ý định chia sẻ nội dung. Chú giải phải mô tả các thành phần hoặc chủ đề chính trong nội dung. Ví dụ về mã sau đây cho biết cách thêm chú giải vào ý định:
Kotlin
val annotations: ArrayList<String> = arrayListOf( "topic1", "topic2", "topic3" ) intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations )
Java
ArrayList<String> annotations = new ArrayList<>(); annotations.add("topic1"); annotations.add("topic2"); annotations.add("topic3"); intent.putStringArrayListExtra( Intent.EXTRA_CONTENT_ANNOTATIONS, annotations );
Để biết thông tin chi tiết về chú thích Chia sẻ thông minh, hãy xem EXTRA_CONTENT_ANNOTATIONS
.
Công cụ phân loại văn bản
Trên các thiết bị tương thích, ứng dụng có thể sử dụng Trình phân loại văn bản mới để kiểm tra xem một chuỗi có khớp với loại thực thể của trình phân loại đã biết hay không và nhận các lựa chọn thay thế được đề xuất. Các đối tượng được hệ thống nhận dạng bao gồm địa chỉ, URL
số điện thoại và địa chỉ email. Để biết thêm thông tin, hãy xem TextClassifier
.
Hỗ trợ tiếp cận
Android 8.0 (API cấp 26) hỗ trợ một số tính năng hỗ trợ tiếp cận mới dành cho các nhà phát triển tạo dịch vụ hỗ trợ tiếp cận của riêng họ:
- Danh mục số lượng mới để điều chỉnh hỗ trợ tiếp cận âm lượng.
- Cử chỉ vân tay làm cơ chế nhập.
- Đa ngôn ngữ chuyển văn bản sang lời nói.
- Lối tắt hỗ trợ tiếp cận dựa trên phần cứng để truy cập nhanh vào một dịch vụ hỗ trợ tiếp cận ưu tiên.
- Hỗ trợ các cử chỉ tiếp tục hoặc các trình tự nét vẽ có lập trình.
- Một hỗ trợ tiếp cận nút để gọi một trong nhiều tính năng hỗ trợ tiếp cận đã bật (chỉ có trên các thiết bị sử dụng khu vực điều hướng được kết xuất bằng phần mềm).
- Đã chuẩn hoá giá trị trong dải một chiều.
- Một số tính năng giúp bạn xử lý văn bản dễ dàng hơn, bao gồm cả văn bản gợi ý và vị trí của các ký tự văn bản trên màn hình.
Bảo mật và quyền riêng tư
Quyền
Android 8.0 (API cấp 26) giới thiệu một số quyền mới liên quan đến điện thoại:
-
Quyền
ANSWER_PHONE_CALLS
cho phép ứng dụng của bạn trả lời cuộc gọi đến theo phương thức lập trình. Để xử lý cuộc gọi điện thoại đến trong ứng dụng, bạn có thể sử dụng phương thứcacceptRingingCall()
. -
Quyền
READ_PHONE_NUMBERS
cấp cho ứng dụng của bạn quyền đọc các số điện thoại được lưu trữ trên thiết bị.
Cả hai quyền này đều được phân loại là nguy hiểm và đều thuộc nhóm quyền PHONE
.
API khám phá và truy cập tài khoản mới
Android 8.0 (API cấp 26) giới thiệu một số điểm cải tiến về cách ứng dụng truy cập vào tài khoản người dùng. Đối với các tài khoản mà chúng quản lý, trình xác thực có thể sử dụng chính sách của riêng mình để quyết định xem có ẩn hay tiết lộ tài khoản cho một ứng dụng hay không. Hệ thống Android theo dõi các ứng dụng có thể truy cập vào một tài khoản cụ thể.
Trong các phiên bản Android trước, những ứng dụng muốn theo dõi danh sách tài khoản người dùng phải nhận thông tin cập nhật về tất cả tài khoản, bao gồm cả những tài khoản có loại không liên quan. Android 8.0 thêm phương thức addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
để cho phép các ứng dụng chỉ định danh sách các loại tài khoản cần nhận thay đổi về tài khoản.
Nội dung thay đổi đối với API
AccountManager cung cấp 6 phương thức mới để giúp các trình xác thực quản lý các ứng dụng có thể xem một tài khoản:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
: Đặt mức độ hiển thị cho một gói và tài khoản người dùng cụ thể kết hợp.-
getAccountVisibility(android.accounts.Account, java.lang.String)
: Xem cấp độ hiển thị cho gói và tài khoản người dùng cụ thể kết hợp. -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
: Cho phép trình xác thực nhận các tài khoản và cấp độ hiển thị cho một gói nhất định. -
getPackagesAndVisibilityForAccount(android.accounts.Account)
: Cho phép trình xác thực lấy giá trị chế độ hiển thị đã lưu trữ cho một tài khoản cụ thể. -
addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle, java.util.Map<java.lang.String, java.lang.Integer>)
: Cho phép trình xác thực khởi chạy các giá trị chế độ hiển thị của một tài khoản. -
addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[])
: Thêm trình ngheOnAccountsUpdateListener
vào đối tượngAccountManager
. Hệ thống gọi trình nghe này bất cứ khi nào danh sách tài khoản trên thiết bị thay đổi.
Android 8.0 (API cấp 26) giới thiệu hai giá trị Tên gói đặc biệt để chỉ định chế độ hiển thị
cho các ứng dụng không được thiết lập bằng cách sử dụng
setAccountVisibility(android.accounts.Account, java.lang.String, int)
. Giá trị chế độ hiển thị PACKAGE_NAME_KEY_LEGACY_VISIBLE
được áp dụng cho các ứng dụng có quyền GET_ACCOUNTS
và nhắm đến các phiên bản Android thấp hơn Android 8.0 hoặc có chữ ký khớp với trình xác thực nhắm đến bất kỳ phiên bản Android nào.
PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE
cung cấp giá trị hiển thị mặc định cho
các ứng dụng chưa được thiết lập trước đây và
PACKAGE_NAME_KEY_LEGACY_VISIBLE
không
có thể áp dụng.
Để biết thêm thông tin về các API khám phá và truy cập tài khoản mới, hãy xem
tham khảo cho
AccountManager
và
OnAccountsUpdateListener
.
Thử nghiệm
Kiểm thử đo lường
Android 8.0 (API cấp 26) cung cấp các tính năng hỗ trợ bổ sung sau đây cho các kiểm thử đo lường của ứng dụng.
Chạy trên các quy trình ứng dụng không phải mặc định
Bây giờ, bạn có thể chỉ định rằng một kiểm thử đo lường cụ thể sẽ chạy dựa trên một quy trình bên ngoài quy trình mặc định của ứng dụng. Cấu hình này hữu ích nếu ứng dụng của bạn chứa nhiều hoạt động chạy trong nhiều quy trình.
Để xác định hoạt động đo lường quy trình không phải mặc định, hãy chuyển đến tệp kê khai, sau đó chuyển đến phần tử <instrumentation>
mong muốn. Thêm
android:targetProcess
và đặt giá trị của thuộc tính đó thành một trong
như sau:
- Tên của một quy trình cụ thể.
- Danh sách tên quy trình được phân tách bằng dấu phẩy.
- Một ký tự đại diện (
"*"
), cho phép chạy khả năng đo lường dựa trên bất kỳ quy trình được khởi chạy nào thực thi mã trong gói được chỉ định trong thuộc tínhandroid:targetPackage
.
Trong khi kiểm thử đo lường đang thực thi, bạn có thể kiểm tra quy trình mà kiểm thử đo lường đang kiểm thử bằng cách gọi getProcessName()
.
Báo cáo kết quả trong khi thử nghiệm
Giờ đây, bạn có thể báo cáo kết quả trong khi kiểm thử đo lường đang thực thi, thay vì sau đó, bằng cách gọi addResults()
.
Ý định mô phỏng cho việc kiểm thử
Để dễ dàng tạo các hoạt động kiểm thử giao diện người dùng độc lập, riêng biệt cho ứng dụng, Android 8.0 (API cấp 26) giới thiệu phương thức onStartActivity()
. Bạn ghi đè phương thức này trong một lớp con tuỳ chỉnh của lớp Instrumentation.ActivityMonitor
để xử lý một ý định cụ thể mà lớp kiểm thử của bạn gọi.
Khi lớp kiểm thử của bạn gọi ý định, phương thức sẽ trả về một mã giả lập
Đối tượng Instrumentation.ActivityResult
thay vì thực thi
chính ý định. Bằng cách sử dụng logic ý định mô phỏng này trong các kiểm thử, bạn có thể tập trung
về cách hoạt động của bạn chuẩn bị và xử lý ý định mà bạn truyền đến một
hoạt động khác nhau hoặc chuyển sang một ứng dụng hoàn toàn khác.
Thời gian chạy và Công cụ
Tối ưu hoá nền tảng
Android 8.0 (API cấp 26) mang thời gian chạy và các tính năng tối ưu hoá khác cho nền tảng dẫn đến một số cải thiện về hiệu suất. Những hoạt động tối ưu hoá này bao gồm thu thập rác bằng cách nén đồng thời, sử dụng bộ nhớ và vị trí của mã hiệu quả hơn.
Những tính năng tối ưu hoá này giúp rút ngắn thời gian khởi động cũng như cải thiện hiệu suất của cả hệ điều hành và ứng dụng.
Cập nhật tính năng hỗ trợ ngôn ngữ Java
Android 8.0 (API cấp 26) hỗ trợ thêm một số API Java OpenJDK:
java.time
từ OpenJDK 8.java.nio.file
vàjava.lang.invoke
trong OpenJDK 7.
Để tìm hiểu thêm về các lớp và phương thức trong các gói mới thêm này, hãy xem tài liệu tham khảo API.
Nếu bạn muốn dùng các tính năng ngôn ngữ Java 8 trong Android Studio, thì bạn nên tải phiên bản xem trước mới nhất xuống.
API Khung Android ICU4J đã cập nhật
Android 8.0 (API cấp 26) mở rộng API Khung Android ICU4J (là một tập hợp con của các API ICU4J) để các nhà phát triển ứng dụng sử dụng trong gói android.icu
. Các API này sử dụng dữ liệu bản địa hoá
có trên thiết bị, nhờ đó bạn có thể giảm dấu vết APK bằng cách không biên dịch
Các thư viện ICU4J trong APK của bạn.
Bảng 1. Các phiên bản ICU, CLDR và Unicode được sử dụng trong Android.
Cấp độ API của Android | Phiên bản ICU | Phiên bản CLDR | Phiên bản Unicode |
---|---|---|---|
Android 7.0 (API cấp 24), Android 7.1 (API cấp 25) | 56 | 28 | 8.0 |
Android 8.0 (API cấp 26) | 58.2 | 30.0.3 | 9.0 |
Để biết thêm thông tin về việc quốc tế hoá trên Android, bao gồm cả tính năng hỗ trợ ICU4J, hãy xem phần Quốc tế hoá trên Android.
Android Enterprise
Đã ra mắt các tính năng và API mới dành cho doanh nghiệp cho các thiết bị đang chạy Android 8.0 (API cấp 26). Một số điểm nổi bật bao gồm:
- Hồ sơ công việc trên các thiết bị được quản lý đầy đủ cho phép các doanh nghiệp tách riêng dữ liệu công việc với dữ liệu cá nhân, đồng thời quản lý cả hai.
- Tính năng uỷ quyền API cho phép chủ sở hữu thiết bị và chủ sở hữu hồ sơ chỉ định việc quản lý ứng dụng cho các ứng dụng khác.
- Cải thiện trải nghiệm người dùng trong quy trình cấp phép (bao gồm tuỳ chỉnh) giảm thời gian thiết lập.
- Các tính năng kiểm soát mới qua Bluetooth, Wi-Fi, sao lưu và bảo mật cho phép doanh nghiệp quản lý nhiều thiết bị hơn. Tính năng ghi nhật ký hoạt động mạng giúp các doanh nghiệp theo dõi các vấn đề.
Để tìm hiểu thêm về các API và tính năng mới này cũng như các API và tính năng khác dành cho doanh nghiệp trên Android, hãy xem bài viết Android trong doanh nghiệp.