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 cũng như nhà phát triển. Tài liệu này nêu bật những tính năng mới dành cho nhà phát triển.
Hãy nhớ tham khảo Các thay đổi về hành vi của Android 8.0 để tìm hiểu những 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
Hình trong hình trên Android 8.0.
Android 8.0 (API cấp 26) cho phép các hoạt động khởi chạy ở chế độ hình trong hình (PIP). PIP là một loại chế độ nhiều cửa sổ đặc biệt, chủ yếu được dùng để phát video. Chế độ PIP ban đầu 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 một hoạt động ở chế độ PIP (Hình trong hình), hoạt động đó sẽ ở trạng thái tạm dừng nhưng vẫn sẽ tiếp tục hiển thị nội dung. Vì lý do này, bạn phải đảm bảo ứng dụng 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 sau onStart()
. Để biết thêm thông tin, hãy xem bài viết Vòng đời nhiều cửa sổ.
Để 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.
(Kể 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
. Bạn sẽ truyền đối tượng này đến các phương thức PIP để chỉ định cách hoạt động sẽ hoạt động khi ở chế độ PIP (Hình trong hình). Đối tượng này chỉ định các thuộc tính, chẳng hạn 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 hình trong hình trên mọi 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 do args chỉ định. Nếu bất kỳ trường nào trong args 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 màn hình; phần còn lại của màn hình sẽ được lấp đầy bằng hoạt động trước đó trên màn hình. Hoạt động chuyển sang chế độ PIP (Hình trong hình) 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ình trong hình), 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 tiếp cận với hoạt động khi đang ở trạng thái PIP (Hình trong hình).
-
Activity.setPictureInPictureParams()
: Cập nhật chế độ cài đặt cấu hình PIP (Hình trong hình) của một hoạt động. Nếu hoạt động hiện đang ở chế độ PIP, thì các chế độ cài đặt sẽ được cập nhật. Việc này sẽ hữu ích nếu tỷ lệ khung hình của hoạt động thay đổi. Nếu hoạt động không ở chế độ PIP, thì các chế độ cài đặt cấu hình này sẽ được sử dụng bất kể bạn gọi phương thứcenterPictureInPictureMode()
nào.
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ý các chế độ cài đặt và hành vi thông báo. 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 một kênh mà người dùng có thể tuỳ chỉnh đối với 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 ở dạng danh mục thông báo. Để tìm hiểu cách triển khai các kênh thông báo, hãy xem phần 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ợ 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. Dấu chấm thông báo phản ánh sự hiện diện của thông báo mà người dùng chưa đóng hoặc hành động. Để tìm hiểu cách xử lý 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 ẩn thông báo. Điều này sẽ 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 xuất hiện lại với cùng mức độ quan trọng như lần đầu xuất hiện. Các ứng dụng có thể xoá hoặc cập nhật thông báo đã tạm ẩn, nhưng việc cập nhật thông báo đã tạm ẩn không khiến thông báo đó 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 khoảng thời gian mà sau đó một thông báo sẽ bị huỷ. Nếu cần, bạn có thể huỷ một thông báo trước khi hết khoảng thời gian chờ đã chỉ định. - Chế độ 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 cách sử dụng ý địnhNotification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES
. Hệ thống có thể cung cấp các dữ liệu 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
. - Loại bỏ thông báo: Người dùng có thể tự loại bỏ thông báo và ứng dụng có thể lập trình để xoá thông báo. Bạn có thể xác định thời điểm một thông báo bị loại bỏ và lý do thông báo đó bị loại bỏ 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 thông báo. Bạn chỉ nên sử dụng tính năng này trong các thông báo về các nhiệm vụ đang diễn ra mà người dùng cần phải xem nhanh. Ví dụ: bạn có thể đặt màu nền cho các thông báo liên quan đến thông tin chỉ đường lái xe hoặc một cuộc gọi điện thoại đang diễn ra. Bạn cũng có thể đặt màu nền mong muốn bằng
setColor()
. Cách làm này cho phép bạn dùngsetColorized()
để cho phép sử dụng màu nền cho một thông báo. - Kiểu thông báo: Trong Android 8.0, các thông báo dùng lớp
MessagingStyle
sẽ hiển thị nhiều nội dung hơn ở dạng thu gọn. Bạn nên dùng lớpMessagingStyle
cho các thông báo liên quan đến tính năng nhắn tin. 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 trước đây vào thông báo liên quan đến tính năng nhắn tin.
![Một trình đơn khi nhấn và giữ thông báo trong Android 8.0 (API cấp 26).](https://developer.android.com/static/images/about/versions/oreo/notification-long-press.png?authuser=5&hl=vi)
Người dùng có thể nhấn và giữ biểu tượng trình chạy ứng dụng để xem thông báo trong Android 8.0.
Khung tự động điền
Các giao dịch tạo tài khoản, đăng nhập và thẻ tín dụng mất nhiều thời gian và dễ gặp 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 tác vụ lặp lại này.
Android 8.0 (API cấp 26) giúp việc điền các biểu mẫu (chẳng hạn như biểu mẫu đăng nhập và thẻ tín dụng) trở nên dễ dàng hơn nhờ có Khung tự động điền. Các ứng dụng hiện có và ứng dụng mới hoạt động với Khung tự động điền sau khi người dùng chọn 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 của mình hoạt động với khung này. Để biết thêm thông tin, hãy xem bài viết 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ừ ứng dụng của nhà cung cấp thay vì gói các phông chữ vào tệp APK hoặc cho phép APK tải phông chữ xuống. Tính năng này giúp giảm kích thước tệp APK, tăng tỷ lệ cài đặt thành công của ứng dụng và cho phép nhiều ứng dụng dùng chung một 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 bài viết 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, cho phép bạn sử 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 các phông chữ dưới dạng thành phần. Phông chữ được biên dịch trong tệp R
và tự động xuất hiện trong hệ thống dưới dạng tài nguyên. Sau đó, bạn có thể truy cập vào những phông chữ này với sự 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 đủ cho 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ữ trong 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 gọn dựa trên kích thước của TextView. Điều này có nghĩa là bạn có thể tối ưu hoá kích thước văn bản trên nhiều loại màn hình hoặc với nội dung động một cách dễ dàng hơn nhiều. Để 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 các 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 các mẫu thiết bị khác nhau. Để 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 tạo 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 rộng gamut. Để hiển thị hình ảnh gam màu rộng, các ứng dụng cần bật cờ trong tệp kê khai (theo hoạt động) và tải bitmap có cấu hình 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 trên web trong ứng dụng của bạn. Các API này giúp cải thiện độ ổn định và tính 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ý chấm dứt
- API Mức độ 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 bài viết Quản lý WebView.
Lớp WebView
hiện có một Safe Browsing API để tăng cường bảo mật cho hoạt động duyệt web. Để biết thêm thông tin, hãy xem bài viết 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) ra mắt tính năng ghim lối tắt và tiện ích trong ứng dụng. Trong ứng dụng của mình, 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ỳ theo sự cho phép của người dùng.
Để biết thêm thông tin, hãy xem hướng dẫn về tính năng Ghim lối tắt và tiện ích.
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 ra mắt thuộc tính maxAspectRatio. Bạn có thể sử dụng thuộc tính này để đặ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ẽ cung cấp dịch vụ 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, thì người dùng có thể di chuyển hoạt động đó từ màn hình này sang màn hình khác. Khi một ứng dụng khởi chạy một hoạt động, ứng dụng có thể chỉ định màn hình hiển thị hoạt động đó sẽ chạy trên đó.
Lưu ý: Nếu một hoạt động hỗ trợ chế độ nhiều cửa sổ, thì Android 8.0 sẽ tự động bật tính năng hỗ trợ nhiều màn hình cho hoạt động đó. Bạn nên kiểm thử ứng dụng của mình để đảm bảo ứng dụng hoạt động bình thường trong môi trường nhiều màn hình.
Mỗi lần 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 bị dừng. Để biết thêm thông tin về vòng đời hoạt động khi có một số 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ỷ quy trình chứa hoạt động và tạo lại hoạt động đó bằng các chiều mới. Để biết thêm thông tin, hãy xem phần Xử lý các thay đổi về cấu hình.
ActivityOptions
cung cấp 2 phương thức mới để hỗ trợ nhiều màn hình:
setLaunchDisplayId()
- Chỉ định xem hoạt động nào sẽ hiển thị khi hoạt động đó được chạy.
getLaunchDisplayId()
- Trả về màn hình chạy hiện tại của hoạt động.
Shell adb được mở rộng để hỗ trợ nhiều màn hình.
Bây giờ, 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>
Lề và khoảng đệm của bố cục hợp nhất
Android 8.0 (API cấp 26) giúp bạn dễ dàng chỉ định các tình huống trong đó các cạnh đối diện của phần tử View
sử dụng cùng lề hoặc khoảng đệm.
Cụ thể, giờ đây, bạn có thể sử dụng các thuộc tính sau trong tệp XML bố cục:
-
layout_marginVertical
, xác định cùng lúclayout_marginTop
vàlayout_marginBottom
. -
layout_marginHorizontal
, xác định cùng lúclayout_marginLeft
vàlayout_marginRight
. -
paddingVertical
, xác định cùng lúcpaddingTop
vàpaddingBottom
. -
paddingHorizontal
, xác định cùng lúcpaddingLeft
vàpaddingRight
.
Lưu ý: Nếu bạn tuỳ chỉnh logic của ứng dụng để hỗ trợ nhiều ngôn ngữ và văn hoá, bao gồm cả hướng văn bản, hãy lưu ý rằng các thuộc tính này không ảnh hưởng đến giá trị của
layout_marginStart
,
layout_marginEnd
,
paddingStart
hoặc
paddingEnd
. Ngoài các thuộc tính bố cục dọc và ngang mới, bạn có thể tự đặt các giá trị này để 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á) được hưởng lợi đáng kể khi có quyền kiểm soát con trỏ chuột. Thu thậ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 phân phối tất cả sự kiện chuột đến một 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 thu thập con trỏ và xác định trình nghe để xử lý các sự kiện con trỏ đã ghi. Con trỏ chuột bị ẩn khi ở chế độ này. Khung hiển thị có thể huỷ thao tác chụp con trỏ
khi không cần thông tin về chuột nữa. Hệ thống cũng có thể huỷ chụp con trỏ khi khung hiển thị mất tiêu điểm, chẳng hạn như 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 của bạn, hãy xem phần Chụp 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 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ự nhau khi hiển thị 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 một 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 trải nghiệm màn hình chính của Android TV tập trung vào nội dung mới. Trải nghiệm này có sẵn cùng với 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 theo hàng tương ứng với các kênh, trong đó mỗi hàng do một ứng dụng trên hệ thống điền sẵn các chương trình. Các ứ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 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. Hàng này được điền sẵn các chương trình của ứ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 dùng để điền kênh và chương trình đều là một phần của API TvProvider. API này được phân phối dưới dạng mô-đun Thư viện hỗ trợ Android chạy Android 8.0.
Tập hợp hoạ sĩ diễn hoạt
Kể từ Android 8.0 (API cấp 26), AnimatorSet
API hiện hỗ trợ tính năng tìm kiếm và phát ngược lại. Tính năng tua cho phép bạn đặt vị trí của ảnh động được đặt thành một thời điểm cụ thể. Việc phát đảo 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 bộ ảnh động riêng biệt, bạn có thể phát ngược lại cùng một bộ.
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 hệ phân cấp khung hiển thị phức tạp, chẳng hạn như hệ phân cấp khung hiển thị trong Hình 2, hãy 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 các cụm để dễ dàng di chuyển bằng bàn phím hơn. Người dùng có thể nhấn tổ hợp phím Meta+Tab hoặc Search+Tab trên thiết bị Chromebook để di chuyển từ cụm này sang cụm khác. Sau đây là một số ví dụ về các cụ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.
![Một hoạt động mẫu bao gồm 5 cụm điều hướng mà người dùng có thể di chuyển bằng phím tắt cụm điều hướng bằng bàn phím. Các cụm xuất hiện theo cách sắp xếp sau: bảng điều khiển trên cùng, bảng điều khiển bên trái, vùng nội dung chính, bảng điều khiển dưới cùng và nút hành động nổi.](https://developer.android.com/static/images/about/versions/oreo/keyboard-navigation-clusters.png?authuser=5&hl=vi)
Để tạo một phần tử View
hoặc ViewGroup
thành một cụm, hãy đặt thuộc tính
android:keyboardNavigationCluster
thành true
trong tệp XML bố cục của phần tử đó hoặc chuyể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 thể lồng nhau, mặc dù các cụm không lồng nhau có thể xuất hiện ở nhiều cấp trong hệ phân cấp. Nếu bạn cố gắng lồng các cụm, khung sẽ chỉ coi phần tử ViewGroup
trên cùng là 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 theo cụm thành true
để cho phép chỉ di chuyển theo cụm 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, thì người dùng không thể sử dụng phím Tab hoặc các phím mũi tên để di chuyển vào hoặc ra khỏi cụm đó; họ phải nhấn tổ hợp bàn 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ể gán View
sẽ nhận tiêu điểm sau khi một hoạt động (đã tạo lạ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 thẻ. Để áp dụng chế độ cài đặt "lấy làm tâm đ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 thành phần giao diện người dùng hoặc truyền true
đến setFocusedByDefault()
trong logic giao diện người dùng của ứng dụng.
Phản hồi bằng lời nói
Các hoạt động và dịch vụ có thể dùng thực thể của TextToSpeech
để nhập bằng giọng nói và phát âm nội dung. Kể từ Android 8.0 (API cấp 26), ứng dụng của bạn có thể nhận thông tin thời gian chính xác hơn về thời điểm 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ể sử dụng chức năng này để thu hút sự chú ý đến những từ cụ thể khi công cụ chuyển văn bản sang lời nói đang đọc.
Để sử dụng những điểm cải tiến này của công cụ chuyển văn bản sang lời nói trong ứng dụng của bạn, hãy đăng ký một bản sao của UtteranceProgressListener
. Trong quá trình đăng ký, hãy đưa một trình xử lý cho phương thức 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 bắt đầu phát âm thanh của một phạm vi văn bản cụ thể. Khi âm thanh cho phạm vi văn bản đó bắt đầu phát, phương thức onRangeStart()
của ứng dụng sẽ thực thi. 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 dải văn bản liên quan đến cách phát âm.
Để 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) bổ sung 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 của bạn:
detectUnbufferedIo()
sẽ phát hiện thời điểm ứng dụng đọ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ể đến hiệu suất.detectContentUriWithoutPermission()
sẽ phát hiện trường hợp ứ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.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 liên quan đến dữ liệu được lưu vào bộ nhớ đệm. Mỗi ứng dụng hiện được cấp một hạn mức dung lượng ổ đĩa cho dữ liệu đã lưu vào bộ nhớ đệm do 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 các ứng dụng đã dùng hết hạn mức được phân bổ. Do đó, nếu bạn vẫn để dữ liệu đã lưu vào bộ nhớ đệm trong hạn mức được phân bổ, thì các tệp đã lưu vào bộ nhớ đệm sẽ là một số tệp cuối cùng trên hệ thống cần được xoá khi cần thiết. Khi quyết định cần xoá tệp nào đã lưu vào 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 tiên (theo thời gian sửa đổi xác định).
Ngoài ra còn có hai hành vi mới mà bạn có thể bật trên từng thư mục để kiểm soát cách hệ thống giải phóng dữ liệu đã 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 đó cần được xoá dưới dạng một đơn vị nguyên tử. - Bạn có thể sử dụng
setCacheBehaviorTombstone(File, boolean)
để cho biết rằng thay vì xoá các tệp bên trong một thư mục, chúng tôi nên cắt bớt các tệp có độ dài bằng 0 byte và để nguyên tệp trống.
Cuối cùng, khi 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 giữ dữ liệu mới hay không, hãy gọi getAllocatableBytes(UUID)
thay vì sử dụng getUsableSpace()
, vì trước đó sẽ xem xét mọi dữ liệu đã lưu vào bộ nhớ đệm mà hệ thống sẵn sàng xoá thay cho bạn.
Tính năng phân trang của 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 để hỗ trợ việc tải một tập dữ liệu lớn lần lượt từng trang. Ví dụ: một ứ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 để trình bày trong 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 đối tượng Con trỏ duy nhất. 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
Giờ đây, mỗi lớp ContentProvider
và ContentResolver
đều bao gồm một phương thức refresh()
, giúp khách hàng dễ dàng biết được thông tin mà họ yêu cầu có cập nhật hay không.
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 ứng dụ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 gọi là refresh()
. Khi gọi phương thức này, hãy chuyển vào URI của dữ liệu để làm mới.
Lưu ý: Vì có thể bạn đang yêu cầu dữ liệu qua một 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 làm mới nội dung này là để phản hồi thao tác vuốt để làm mới, yêu cầu rõ ràng giao diện người dùng hiện tại để hiển thị nội dung mới nhất.
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 thực thi ở chế độ nền mới, vì bạn thường có thể sử dụng các công việc theo lịch để thay thế các dịch vụ nền hiện đang bị hạn chế hoặc broadcast receiver ngầm ẩn.
Nội dung cập nhật đối với JobScheduler
bao gồm:
-
Giờ đây, bạn có thể liên kết hàng đợi công việc với công việ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 công việc đang chạy, nó có thể đưa công việc đang chờ xử lý ra khỏi hàng đợi và xử lý công việc đó. Chức năng này xử lý nhiều trường hợp sử dụng mà trước đó đã gọi để bắt đầu dịch vụ nền, cụ thể là các dịch vụ triển khaiIntentService
. -
Thư viện hỗ trợ Android 26.0.0 giới thiệu một lớp
JobIntentService
mới, cung cấp chức năng tương tự nhưIntentService
nhưng sử dụng công việc thay vì dịch 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 lần cấp quyền 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ể sử dụng hoạt động cấp quyền URI với ý định trên hàng đợi công việc. -
Các công việc theo lịch biểu hiện hỗ trợ một số quy tắc ràng buộc mới:
JobInfo.isRequireStorageNotLow()
- Tác vụ sẽ không chạy nếu thiết bị sắp hết dung lượng lưu trữ.
JobInfo.isRequireBatteryNotLow()
- Tác vụ sẽ không chạy nếu mức pin bằng hoặc dưới ngưỡng quan trọng; đây là mức mà thiết bị hiện hộp thoại hệ thống Cảnh báo pin yếu.
NETWORK_TYPE_METERED
- Công việc cần có kết nối mạng có đo lượng dữ liệu, chẳng hạn như hầu hết các gói dữ liệu di động.
Lưu trữ 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 bạn. Việc này có thể hữu ích nếu ứng dụng của bạn lưu trữ lựa chọn ưu tiên trên đám mây hay cơ sở dữ liệu cục bộ, hoặc nếu lựa chọn ưu tiên là dành riêng cho thiết bị. Để biết thêm thông tin về cách triển khai kho dữ liệu, hãy tham khảo bài viết Kho dữ liệu tuỳ chỉnh.
Cải tiến nội dung nghe nhìn
Trình tạo khối lượng
Có một lớp VolumeShaper
mới. Hãy sử dụng công cụ này để thực hiện các quá trình chuyển đổi âm lượng tự động ngắn như hiệu ứng mờ dần, mờ dần và làm mờ dần.
Xem bài viết Đ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à 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/dừng phát lại hoặc giảm âm lượng.
Có một lớp AudioFocusRequest
mới. Khi sử dụng lớp này làm tham số của requestAudioFocus()
, các ứng dụng sẽ có các chức năng mới khi xử lý các thay đổi về quyền phát âm thanh: tự động giảm tốc độ tập trung và bị trễ lấy tiêu điểm.
Chỉ số về nội dung nghe nhìn
Phương thức getMetrics()
mới trả về một đối tượng PersistableBundle
chứa thông tin về cấu hình và hiệu suất, được biểu thị dưới dạng bản đồ của 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 đa phương tiện sau:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
Các chỉ số được thu thập riêng biệt cho từng thực thể và duy trì trong suốt thời gian hoạt động của thực thể. Nếu không có chỉ số, phương thức sẽ trả về giá trị rỗng. Các chỉ số thực tế được trả về sẽ phụ thuộc vào lớp.
MediaPlayer
Kể từ Android 8.0 (API cấp 26), MediaPlayer có thể phát nội dung được bảo vệ bằng DRM và nội dung nghe nhìn được mã hoá ở cấp mẫu HLS.
Android 8.0 ra mắt một lệnh seekTo()
nạp chồng mới cung cấp khả năng kiểm soát chi tiết khi tìm kiếm một khung hình. Hàm này bao gồm tham số thứ hai chỉ định chế độ tìm kiếm:
SEEK_PREVIOUS_SYNC
di chuyển vị trí nội dung đa phương tiện sang 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 nhất định.SEEK_NEXT_SYNC
di chuyển vị trí nội dung đa phương tiện sang khung đồng bộ hoá (hoặc khoá) liên kết với một nguồn dữ liệu nằm ngay sau hoặc tại thời điểm nhất định.SEEK_CLOSEST_SYNC
di chuyển vị trí nội dung đa phương tiện đến một khung đồng bộ hoá (hoặc khoá) liên kết với một nguồn dữ liệu ở gần hoặc tại thời điểm nhất định.SEEK_CLOSEST
di chuyển vị trí nội dung đa phương tiện đến một khung (không nhất thiết phải là khung đồng bộ hoá hoặc khung chính) được liên kết với một nguồn dữ liệu ở gần hoặc nhất tại thời điểm nhất định.
Khi tìm kiếm liên tục, ứng dụng phải 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 phát trực tuyến:
Kotlin
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
Java
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
MediaMuxer
nay 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 ở một bản âm thanh và/hoặc một bản video nữa. 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 thông tin do người dùng xác định trên mỗi khung hình. Định dạng của siêu dữ liệu do ứng dụng của bạn xác định. Bản nhạc 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 dùng để ổn định video.
Khi thêm một bản nhạc siêu dữ liệu, định dạng mime của bản nhạc đó phải bắt đầu bằng tiền tố "application/". Việc ghi siêu dữ liệu cũng giống như việc ghi dữ liệu video/âm thanh, ngoại trừ việc dữ liệu không đến từ MediaCodec
. Thay vào đó, ứng dụng sẽ chuyể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 trùng với thời điểm của bản âm thanh và video.
Tệp MP4 được tạo sẽ sử dụng TextMetaDataSampleEntry
được xác định trong mục 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ó theo dõi siêu dữ liệu, định dạng MIME 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
Khung truy cập bộ nhớ (SAF) cho phép các ứng dụng hiển thị DocumentsProvider
tuỳ chỉnh. Khung này có thể cung cấp quyền truy cập vào các tệp trong nguồn dữ liệu cho các ứng dụng khác. Trên thực tế, nhà cung cấp tài liệu thậm chí còn 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 nội dung nghe nhìn có dung lượng lớn từ một nguồn dữ liệu từ xa 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 một tệp của nhà cung cấp tài liệu. Trong trường hợp một tệp nội dung nghe nhìn có dung lượng lớn nằm trên một nguồn dữ liệu từ xa, 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ó chỉ số mô tả tệp, do đó, quá trình phát sẽ không thể bắt đầu cho đến khi nhà cung cấp tài liệu hoàn tất quá trình tải tệp xuống.
- Các 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 một loạt URI truy cập để truy cập vào nội dung nghe nhìn được lưu trữ trên thẻ SD bên ngoài thông qua các thư mục trong phạm vi. Mẫu truy cập này làm cho các thao tác hàng loạt trên nội dung đa phương tiệ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 của tài liệu. Điều này khiến các loại ứng dụng này khó cho phép người dùng chọn vị trí 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 Khung truy cập bộ nhớ.
Nhà cung cấp tài liệu tuỳ chỉnh
Kể từ Android 8.0, Khung truy cập bộ nhớ (Storage Access Framework) cho phép các 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 một 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 byte riêng biệt đến 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ề chính xác phạm vi 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ộ tệp vào bộ nhớ đệm trước đó.
Để sử dụng tính năng này, bạn cần gọi phương thức StorageManager.openProxyFileDescriptor()
mới. Phương thức openProxyFileDescriptor()
chấp nhận đối tượng ProxyFileDescriptorCallback
làm lệnh gọi lại. SAF gọi 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 mà nhà cung cấp tài liệu trả về.
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 URI tham chiếu đến cùng một tài liệu như mediaUri
đã cho.
Tuy nhiên, vì URI được trả về được DocumentsProvider
hỗ trợ, nên các trình quản lý bộ sưu tập đa phương tiện có thể truy cập trực tiếp vào tài liệu mà không cần phải truyền tải qua các cây của các thư mục có phạm vi.
Do đó, trình quản lý nội dung đa phương tiện có thể thực hiện các thao tác đối với tệp trên 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 mà 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 có được quyền truy cập vào tệp nội dung nghe nhì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ể dùng phương thức findDocumentPath()
có trong cả hai lớp DocumentsContract
và DocumentsProvider
để 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 của tài liệu. Phương thức này sẽ trả về đường dẫn này trong đối tượng DocumentsContract.Path
. Trong trường hợp hệ thống tệp có nhiều đường dẫn được xác định đến cùng một tài liệu, phương thức này sẽ trả về đường dẫn được sử dụng thường xuyên nhất để truy cập vào tài liệu có mã nhận dạng cho trước.
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 dùng hộp thoại "lưu dưới dạng" cho thấy 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 trong chế độ xem kết quả tìm kiếm và phải tải các tài liệu con nằm trong một thư mục cụ thể nếu người dùng chọn thư mục đó.
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.
Giám sát chế độ phát âm thanh
Dịch vụ hệ thống AudioManager
duy trì một danh sách các đối tượng AudioPlaybackConfiguration
đang hoạt động, 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ấu hình đ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ý lệnh gọi lại để thông báo cho ứng dụng khi một hoặc nhiều đối tượng AudioPlaybackConfiguration
đã thay đổi. Để thực hiện việc này, hã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 sẽ gọi khi cấu hình phát âm thanh thay đổi.
Khả năng kết nối
Nhận biết Wi-Fi
Android 8.0 (API cấp 26) bổ sung tính năng hỗ trợ cho tính năng Nhận biết Wi-Fi dựa trên thông số kỹ thuật về Mạng lân cận (NAN). Trên các thiết bị có phần cứng Nhận biết Wi-Fi phù 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 làm việc với các đối tác phần cứng để cung cấp công nghệ Nhận biết Wi-Fi trên các thiết bị trong thời gian sớm nhất có thể. Để biết 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, 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 bằng cách thêm các tính năng sau:
- Hỗ trợ chuẩn AVRCP 1.4, cho phép duyệt qua 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 của 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 bài viết 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. Để biết các thay đổi đối với Bluetooth dành riêng cho Android 8.0 (API cấp 26), hãy xem phần Bluetooth trên trang Các thay đổi về hành vi của Android 8.0.
Chia sẻ
Chia sẻ thông minh
Android 8.0 (API cấp 26) tìm hiểu các lựa chọn ưu tiên của người dùng về việc chia sẻ, cũng như hiểu rõ hơn về từng loại nội dung 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, thì ứng dụng 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ả các mẫu này theo lựa chọn ưu tiên được cá nhân hoá của người dùng.
Tính năng chia sẻ thông minh hoạt động với những loại nội dung không phải image
, chẳng hạn như audio
, video
, text
, URL
, v.v.
Để bật tính năng Chia sẻ thông minh, hãy thêm ArrayList
gồm tối đa 3 chú giải 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 của tính năng Chia sẻ thông minh, hãy xem EXTRA_CONTENT_ANNOTATIONS
.
Công cụ phân loại văn bản
Trên thiết bị tương thích, các ứng dụng có thể dùng một 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 một kiểu thực thể thuật toán phân loại đã biết hay không, cũng như nhận các lựa chọn thay thế đề xuất. Các thực thể đượ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 những nhà phát triển tạo các dịch vụ hỗ trợ tiếp cận riêng:
- Một danh mục âm lượng mới để điều chỉnh âm lượng hỗ trợ tiếp cận.
- Cử chỉ vân tay làm cơ chế nhập.
- Chức năng chuyển văn bản sang lời nói đa ngôn ngữ.
- Phím tắt hỗ trợ tiếp cận dựa trên phần cứng để nhanh chóng truy cập vào một dịch vụ hỗ trợ tiếp cận ưu tiên.
- Hỗ trợ các cử chỉ liên tục hoặc trình tự các nét có lập trình.
- Nút hỗ trợ tiếp cận để 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 kết xuất bằng phần mềm).
- Giá trị trong dải một chiều được chuẩn hoá.
- Một số tính năng giúp 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 các cuộc gọi điện thoạ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 của mình, 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 lưu trữ trong thiết bị.
Các quyền này đều được phân loại là nguy hiểm và đều thuộc nhóm quyền PHONE
.
Các API khám phá và truy cập vào 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 lấy quyền truy cập vào tài khoản người dùng. Đối với các tài khoản mà họ quản lý, trình xác thực có thể sử dụng chính sách riêng để quyết định xem nên ẩn tài khoản hay hiển thị tài khoản cho một ứng dụ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, ứ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ả tài khoản có cá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 ứng dụng chỉ định danh sách các loại tài khoản
cần nhận thay đổi đối với 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 trình xác thực quản lý ứng dụng nào có thể xem một tài khoản:
setAccountVisibility(android.accounts.Account, java.lang.String, int)
: Đặt cấp độ hiển thị cho một tổ hợp gói và tài khoản người dùng cụ thể.-
getAccountVisibility(android.accounts.Account, java.lang.String)
: Nhận cấp độ hiển thị cho một tổ hợp gói và tài khoản người dùng cụ thể. -
getAccountsAndVisibilityForPackage(java.lang.String, java.lang.String)
: Cho phép trình xác thực lấy các tài khoản và cấp độ hiển thị đối với một gói nhất định. -
getPackagesAndVisibilityForAccount(android.accounts.Account)
: Cho phép trình xác thực nhận các giá trị chế độ hiển thị được lưu trữ đối với một tài khoản nhất định. -
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 tạo các giá trị hiển thị của 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 sẽ gọi trình nghe này bất cứ khi nào danh sách các 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ị Package Name (Tên gói) đặc biệt để chỉ định mức độ hiển thị cho các ứng dụng không được thiết lập bằng phương thức 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à 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ị chế độ hiển thị mặc định cho các ứng dụng chưa được đặt trước đây và không áp dụng PACKAGE_NAME_KEY_LEGACY_VISIBLE
.
Để 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 tài liệu tham khảo cho AccountManager
và OnAccountsUpdateListener
.
Kiểm thử
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 kiểm thử đo lường của ứng dụng.
Chạy theo các quy trình không phải quy trình mặc định của ứng dụng
Giờ đây, bạn có thể chỉ định rằng một kiểm thử đo lường cụ thể sẽ chạy 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 sẽ hữu ích nếu ứng dụng chứa nhiều hoạt động chạy trong nhiều quy trình.
Để xác định khả năng đo lường của quy trình không phải là mặc định, hãy chuyển đến tệp kê khai, sau đó đến phần tử
<instrumentation>
mong muốn. Thêm thuộc tính android:targetProcess
và đặt giá trị của thuộc tính đó thành một trong các giá trị sau:
- Tên của một quy trình cụ thể.
- Danh sách các 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 công cụ đo lường chạy theo bất kỳ quy trình đã khởi chạy nào có thực thi mã trong gói được chỉ định ở thuộc tínhandroid:targetPackage
.
Trong khi kiểm thử đo lường đang thực thi, bạn có thể kiểm tra xem quy trình đó đang kiểm thử bằng cách gọi getProcessName()
.
Báo cáo kết quả trong khi thử nghiệm
Thay vì sau đó, bạn có thể báo cáo kết quả trong khi kiểm thử đo lường đang thực thi bằng cách gọi addResults()
.
Ý định mô phỏng cho hoạt động kiểm thử
Để giúp bạn dễ dàng tạo các bài kiểm thử giao diện người dùng tách biệt, độc lập cho các hoạt động của ứng dụng, Android 8.0 (API cấp 26) ra mắt phương thức onStartActivity()
. Bạn sẽ 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 này sẽ trả về một đối tượng Instrumentation.ActivityResult
mã giả lập thay vì tự thực thi ý đị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ào 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 hoặc đến 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 đến thời gian chạy và các tính năng tối ưu hoá khác cho nền tảng, nhờ đó cải thiện một số hiệu suất. Những hoạt động tối ưu hoá này bao gồm tính năng thu gom rác xử lý đồng thời, sử dụng bộ nhớ hiệu quả hơn và vị trí của mã.
Những tính năng tối ưu hoá này giúp thời gian khởi động nhanh hơn và mang lại hiệu suất tốt hơn trong 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
của 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 muốn sử dụng các tính năng ngôn ngữ Java 8 trong Android Studio, 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ị. Vì vậy, bạn có thể giảm kích thước tệp APK bằng cách không biên dịch các thư viện ICU4J trong tệp APK của mình.
Bảng 1. Các phiên bản ICU, CLDR và Unicode được sử dụng trong Android.
Cấp độ API trên 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ả việc hỗ trợ ICU4J, hãy xem bài viết Quốc tế hoá trên Android.
Android Enterprise
Chúng tôi đã 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ị chạy Android 8.0 (API cấp 26). Các đ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ý hoàn toàn cho phép doanh nghiệp tách riêng công việc khỏ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à hồ sơ chỉ định hoạt động quản lý ứng dụng cho các ứng dụng khác.
- Các điểm cải tiến về trải nghiệm người dùng trong quy trình cấp phép (bao gồm cả các tuỳ chọn tuỳ chỉnh mới) giúp giảm thời gian thiết lập.
- Các chế độ kiểm soát mới đối với Bluetooth, Wi-Fi, tính năng 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 sự cố.
Để tìm hiểu thêm về các API và tính năng này cũng như các API và tính năng mới khác của Android Enterprise, hãy xem nội dung Android trong Enterprise.