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 các 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 tính năng mới dành cho nhà phát triển.

Đừng quên thanh toán Các thay đổi về hành vi của Android 8.0 để tìm hiểu về những khía cạnh mà nền tảng thay đổi 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. Chế độ PIP ban đầu chỉ dành cho Chỉ dành cho 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, một hoạt động sẽ ở trạng thái tạm dừng, nhưng sẽ tiếp tục hiển thị nội dung. Vì lý do này, bạn nên đảm bảo rằng ứng dụng của mình không tạm dừng phát trong onPause() trình xử lý. 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 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ợ thuộc tính khác chế độ nhiều cửa sổ.)

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.

Các phương thức PIP hiện có được mô tả trong Thêm Chế độ Hình trong hình hiện có thể được sử dụng trên tất cả cá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 do args chỉ định. Nếu có trường trong args trống, hệ thống sử dụng giá trị đã đặt vào lần gần đây nhất bạn có tên là 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 đó 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 giữ nguyên đầu. Nếu người dùng nhấn vào hoạt động PIP, hệ thống sẽ hiển thị trình đơn cho để người dùng tương tác; không có sự kiện chạm nào tiếp cận hoạt động trong khi ở trạng thái PIP.

  • Activity.setPictureInPictureParams(): Cập nhật các 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 đề cập vào các kênh thông báo dưới dạng 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. Dấu chấm thông báo phản ánh hiện các thông báo mà người dùng chưa đóng hoặc thực hiện hành động. Để tìm hiểu cách sử dụng các dấu chấm thông báo, hãy xem Thông báo huy hiệu.
  • 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 xuất hiện lại cùng với cùng mức độ quan trọng mà chúng lần đầu xuất hiện. 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 một thông báo đang sử dụ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 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 bạn tạo liên kết đến tệp từ một thông báo bằng cách sử dụng Ý định Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES. Hệ thống có thể cung cấp các thông tin 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 cho người dùng thấy: EXTRA_CHANNEL_ID, NOTIFICATION_TAGNOTIFICATION_ID.
  • Đóng thông báo: Người dùng có thể tự đóng thông báo và các ứng dụng có thể xoá chúng 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ị loại bỏ và tại sao bị loại bỏ 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. Cho ví dụ: bạn có thể đặt màu nền cho thông báo liên quan đến đườ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 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 thẻ tín dụng mất nhiều thời gian và có thể dễ bị . 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 ứng dụng tỷ lệ cài đặt thành cô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 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ữ trong 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 nhóm các phông chữ dưới dạng nội dung. 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 đủ 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ữ ở định dạng XML.

Tự động định cỡ TextView

Android 8.0 (API cấp 26) cho phép bạn đặt kích thước văn bản mở rộng hoặc tự động 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) ra mắt biểu tượng trình chạy thích ứng. Biểu tượng thích ứng hỗ trợ hình ảnh hiệu ứng 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 Biểu tượng thích ứng của chúng tôi.

Quản lý màu sắc

Giờ đây, các nhà phát triển ứng dụng tạo ảnh trên Android có thể tận dụng các thiết bị mới có màn hình hỗ trợ gam màu rộng. Để hiển thị gam màu rộng hình ảnh, ứng dụng sẽ cần bật cờ trong tệp kê khai (cho mỗi hoạt động) và tải bitmap bằng 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 sau:

  • 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 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 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) ra mắt tính năng ghim lối tắt trong ứng dụng và các tiện ích khác nhau. 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 một ứng dụng.

Đầu tiên, Android 8.0 giới thiệu maxAspectRatio mà bạn có thể dùng để đặt tỷ lệ khung hình tối đa cho ứng dụng. Ngoài ra, trong Android 8.0 trở lên, tính năng tỷ lệ khung hình tối đa mặc định 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 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 cung cấp các tính năng nâng cao hỗ trợ 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 một ứng dụng 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 thiết bị hoạt động tốt trong môi trường nhiều màn hình.

Chỉ một hoạt động tại một thời điểm có thể ở trạng thái đã tiếp tục, ngay cả khi ứng dụng của bạn 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. Thông tin khác trên vòng đời hoạt động khi có một số hoạt động hiển thị, xem Nhiều cửa sổ Vòng đời.

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 đổi kích thước hoạt động và báo cáo các thay đổi trong 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ỷ bỏ quá trình chứa hoạt động của bạn và tạo lại nó bằng thứ nguyên. Để 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 mà hoạt động sẽ hiển thị trên đó khi nó được chạy.
getLaunchDisplayId()
Trả về màn hình khởi 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. Giờ đây, bạn có thể dùng lệnh shell start để khởi 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 thu thập con trỏ và định nghĩa một trình nghe để xử lý các sự kiện con trỏ đã thu thậ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 của bạn, hãy xem 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 vào, khi phù hợp. Các danh mục này được dùng để nhóm các ứng dụng tương tự với nhau mục đích hoặc chức năng khi trình bày với người dùng, chẳng hạn như trong mục 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 của mình bằng cách đặt giá trị Thuộc tính android:appCategory trong <application> của bạn thẻ tệp kê khai.

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ể xuất bản nhiều kênh và người dùng có thể định cấu hình kênh nào 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 điền sẵn các chương trình từ ứ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 (tự động phát khi người dùng tập trung vào một chương trình). Các API cho việc điền sẵn kênh và chương trình là một phần của TvProvider API, được phân phối dưới dạng một Android Mô-đun Thư viện hỗ trợ với Android 8.0.

Nhóm hoạt ảnh

Kể từ Android 8.0 (API cấp 26), API AnimatorSet nay hỗ trợ tính năng tìm kiếm và phát trong đảo 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ể. Việc phát theo chiều ngược lại sẽ hữu ích nếu ứng dụng của bạn có ảnh động cho các hành động có thể hoàn tác. Thay vì xác định hai ảnh động riêng biệt các loạt, bạn có thể chơi cùng một loạt ngược lại.

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ư 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 Thiết bị Chromebook, để điều hướng 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 thao tác điều hướng cụm

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ý các 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 một cụm từ được chỉ định ViewGroup của đối tượng Phần tử android:touchscreenBlocksFocus đến true thành cho phép điều hướng chỉ sử dụng cụm vào và ra khỏi cụm đó. Nếu bạn áp dụng phương thức này cấu hình cho một cụm, người dùng không thể sử dụng phím Tab hoặc các phím mũi tên để điều hướng vào hoặc ra khỏi cụm; họ phải nhấn vào nút điều hướng cụm đồng hồ tổ hợp bàn phí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. Cách áp dụng chế độ "lấy tiêu điểm theo mặc định" này cài đặt phần tử View android:focusedByDefault cho 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 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 phiên bản TextToSpeech để đọc chính tả 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 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ý 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 thời điểm mà thiết bị mong đợi phát lại âm thanh trong một phạm vi văn bản cụ thể để bắt đầu. 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 đánh dấu 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 tệp chuyển văn bản sang lời nói công cụ, hãy xem lớp UtteranceProgressListener tham chiếu.

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 có thể xảy ra trong ứng dụng của bạn:

  • 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 khi ứ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 của bạn 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ột ứng dụng hiện được cấp một hạn mức dung lượng đĩa cho dữ liệu được lưu vào bộ nhớ đệm, như được trả về bởi getCacheQuotaBytes(UUID).

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 hệ thống quyết định những tệp nào đã lưu vào bộ nhớ đệm cần xoá trong ứng dụng của bạn, hệ thống sẽ hãy xem xét các tệp cũ nhất trước (như được xác định theo thời gian sửa đổi).

Ngoài ra còn có hai hành vi mới mà bạn có thể bật 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 của bạn:

  • Có thể dùng StorageManager.setCacheBehaviorAtomic() để cho biết rằng thư mục và mọi nội dung của thư mục đó phải được 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 allocateBytes(FileDescriptor, long) API (sẽ tự động xoá) tệp được 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 liệu thiết bị có đủ dung lượng ổ đĩa để lưu trữ dữ liệu mới của bạn, hãy gọi getAllocatableBytes(UUID) thay vì sử dụng getUsableSpace(), vì quy tắc này sẽ xem xét mọi phiên bản được lưu vào bộ nhớ đệm mà hệ thống sẵn sàng xoá thay mặt 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ỏ 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 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 sự kiện này chuyển vào URI của dữ liệu để làm mới.

Lưu ý: Vì bạn có thể yêu cầu dữ liệu qua mạng, bạn nên gọi refresh() từ phía máy khách chỉ khi có dấu hiệu rõ ràng cho biết 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 đối với JobScheduler. Những cải tiến này giúp ứng dụng của bạn dễ dàng để tuân thủ thông tin nền mới giới hạn thực thi, bởi vì bạn thường có thể sử dụng các công việc đã lên lịch để thay thế các dịch vụ nền hiện bị hạn chế hoặc broadcast receiver ngầm ẩn.

Các bản cập nhật cho JobScheduler bao gồm:

  • Bây giờ, bạn có thể liên kết hàng đợi công việc với một công việc đã lên lịch. Để thêm một mục công việc vào hàng đợi công việc, 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. Tùy chọn này cho phép bạn liên kết các trạng thái cấp quyền URI với một công việc, tương tự như cách có thể được cấp quyền truy cập vào 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 sẽ không chạy nếu bộ nhớ còn trống trên thiết bị sắp hết.
    JobInfo.isRequireBatteryNotLow()
    Công việc không chạy nếu mức pin ở mức hoặc thấp hơn mức tới hạn ngưỡng; đây là mức mà thiết bị hiển thị thông báo Pin yếu cảnh báo của hệ thống.
    NETWORK_TYPE_METERED
    Công việc này yêu cầu kết nối mạng có đo lượng dữ liệu, chẳng hạn như hầu hết dữ liệu di động của Google.

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 trong 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. Một ứng dụng xử lý các thay đổi về tiêu điểm bằng cách khởi động 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 mỗi trường hợp và duy trì trong vòng đời của thực thể đó. Nếu không có chỉ số, phương thức sẽ trả về 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. Đoạn mã này bao gồm tham số thứ hai chỉ định chế độ tua:

  • SEEK_PREVIOUS_SYNC di chuyển vị trí nội dung nghe nhìn đến một khung đồng bộ (hoặc phím) được liên kết với nguồn dữ liệu ngay trước hoặc tại một thời điểm nhất định.
  • 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 một khung đồng bộ (hoặc phím) được liên kết với một nguồn dữ liệu gần nhất hoặc tại một thời điểm nhất định.
  • SEEK_CLOSEST di chuyển vị trí nội dung nghe nhìn sang một khung hình (không nhất thiết là đồng bộ hoá) hoặc khung chính) được liên kết với nguồn dữ liệu có vị trí 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 phát 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 bản 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ư 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 truyền một ByteBuffer kèm theo dấu thời gian liên kết với writeSampleData(). Dấu thời gian này phải cùng cơ sở thời gian với video và bản âm thanh.

Tệp MP4 đã 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 đa phương tiện 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 từ nhà cung cấp tài liệu. Trong trường hợp một tệp đa phương tiện 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ả các dữ liệu và tạo một ảnh chụp nhanh chỉ số mô tả tệp. 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 thực hiệ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 tài liệu tuỳ chỉnh nhà cung cấp để 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 một tệp gốc có thể tìm kiếm mã mô tả. Sau đó, SAF gửi các yêu cầu byte riêng biệt đến tài liệu Google Cloud. 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 getDocumentUri() phương thức đến nhận 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 đó, người quản lý truyền thông 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; 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 lấy quyền truy cập quyền truy cập vào các tệp đa 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 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 tính năng "lưu dưới dạng" hộp thoại 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, 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 đang hoạt động AudioPlaybackConfiguration. Mỗi đối tượng trong số đó 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 Chiến lược phát hành đĩa đơn Lớp AudioManager.AudioPlaybackCallback chứa Phương thức onPlaybackConfigChanged() mà hệ thống gọi khi âm thanh các thay đổi về cấu hình phát.

Khả năng kết nối

Nhận biết Wi-Fi

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ó Các ứng dụng, thiết bị ở gần và phần cứng Nhận biết Wi-Fi có thể khám phá và giao tiếp qua Wi-Fi mà không có điểm truy cập Internet. Chúng tôi đang làm việc với phần cứng của mình để cung cấp công nghệ Nhận biết Wi-Fi cho các thiết bị trong thời gian sớm nhất có thể. Cho 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ợ chuẩn Bluetooth 5.0 Năng lượng thấp (BLE).
  • 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 Thiết bị đồng hành Ghép nối.

Để 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. Cho 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ề hoạt động của người dùng chia sẻ được cá nhân hoá và hiểu rõ hơn về từng loại nội dung để 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/tối đa 3 tệp chuỗi chú thích cho ý định chia sẻ nội dung. Chú thích 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ú thích 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, các ứng dụng có thể sử dụng Trình phân loại văn bản mới để kiểm tra xem chuỗi khớp với một loại thực thể phân loại đã biết và nhận lựa chọn đề xuất lựa chọn thay thế. 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 cho những 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, 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 sau ứng dụng của mình, bạn có thể sử dụng 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 là một phần của PHONE nhóm quyền.

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ố cải tiến về cách ứng dụng có 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 có ẩn tài khoản hay không, hoặc tiết lộ 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 trước của Android, cá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ả các tài khoản có không liên quan. Android 8.0 bổ sung addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) Phương thức này cho phép ứng dụng chỉ định danh sách các loại tài khoản cho tài khoản nào sẽ nhận được thay đổi.

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) . Chiến lược phát hành đĩa đơn PACKAGE_NAME_KEY_LEGACY_VISIBLE được áp dụng cho các ứng dụng có GET_ACCOUNTS và các phiên bản mục tiêu của Android thấp hơn Android 8.0 hoặc khớp với trình xác thực nhắm mục tiêu 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ử khả năng đ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 ứng dụng của bạn kiểm thử đo lường.

Chạy dựa trên các quy trình ứng dụng không phải quy trình 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 khả năng đo lường quy trình không mặc định, hãy chuyển đến tệp kê khai rồi chuyển đến tệp mong muốn Phần tử <instrumentation>. 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 thực thi chương trình kiểm thử đo lường, bạn có thể kiểm tra xem quy trình nào đ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 thực thi chương trình kiểm thử đo lường, 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 bài kiểm thử giao diện người dùng độc lập, riêng biệt cho ứng dụng của bạn Android 8.0 (API cấp 26) giới thiệu onStartActivity(). Bạn sẽ ghi đè phương thức này trong một lớp con tuỳ chỉnh của phương thức Instrumentation.ActivityMonitor để xử lý một thuộc tính cụ thể ý định 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 hoạt động tối ưu hoá này giúp thời gian khởi động nhanh hơn, cũng như 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:

Để tìm hiểu thêm về các lớp và phương thức trong các lớp mới được 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 Khung Android ICU4J API – một tập hợp con của các API ICU4J – dành cho 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 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 Hỗ trợ ICU4J, xem 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). Những đ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 giúp doanh nghiệp tách biệt công việc với dữ liệu cá nhân của bạn trong khi quản lý cả hai.
  • Tính năng uỷ quyền API giúp chủ sở hữu thiết bị và hồ sơ chỉ định ứng dụng sang 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 doanh nghiệp theo dõi gặp nhiều vấn đề nhất.

Để tìm hiểu thêm về những API này cũng như các tính năng và API mới khác của Android Enterprise, xem phần Android trong Enterprise.