Tính năng và API của Android 8.0

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ọi Activity.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:

    Một trình đơn nhấn và giữ thông báo trong Android 8.0 (API cấp 26).

    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.

  • 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 ý định Notification.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_TAGNOTIFICATION_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ớp NotificationListenerService.
  • 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ụng setColorized() để 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ớp MessagingStyle 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ức addHistoricMessage() để 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.

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:

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.

Một hoạt động mẫu bao gồm 5 cụm điều hướng mà người dùng có thể điều hướng bằng phím tắt cụm điều hướng trên bàn phím. 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, nội dung chính
  vùng, bảng điều khiển dưới cùng và nút hành động nổi.
Hình 2. Hoạt động chứa 5 cụm điều hướng

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ụng setThreadStatsTag(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 ContentProviderContentProviderClient.

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 khai IntentService.
  • 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ạng IntentService 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ết ClipData 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 đến Context.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 thanhchậ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:

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);

    xem MediaRecorder.OutputFormat

  • 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ụng addTrack() để 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 DocumentsContractDocumentsProvider 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ọ:

Để tìm hiểu thêm về cách giúp ứng dụng dễ tiếp cận hơn, hãy xem phần Hỗ trợ tiếp cận.

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ức acceptRingingCall().
  • 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:

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 AccountManagerOnAccountsUpdateListener.

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ính android: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:

Để 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.