API Android 5.0

Cấp độ API: 21

Android 5.0 (LOLLIPOP) cung cấp các tính năng mới cho người dùng và nhà phát triển ứng dụng. Tài liệu này giới thiệu các API mới đáng chú ý nhất.

Nếu bạn đã phát hành ứng dụng, hãy nhớ xem Các thay đổi về hành vi của Android 5.0 mà bạn nên xem xét trong ứng dụng của mình. Những thay đổi về hành vi này có thể ảnh hưởng đến ứng dụng của bạn trên các thiết bị Android 5.0, ngay cả khi bạn không sử dụng API mới hoặc nhắm đến chức năng mới.

Để có cái nhìn tổng quan về các tính năng mới của nền tảng, thay vào đó, hãy xem những điểm nổi bật của Android Lollipop.

Bắt đầu phát triển

Để bắt đầu tạo ứng dụng cho Android 5.0, trước tiên, bạn phải tải SDK Android. Sau đó, sử dụng Trình quản lý SDK để tải Hình ảnh hệ thống và Nền tảng SDK Android 5.0 xuống.

Cập nhật cấp độ API mục tiêu của bạn

Để tối ưu hoá ứng dụng của bạn một cách hiệu quả hơn cho các thiết bị chạy Android 5.0, hãy đặt targetSdkVersion thành "21", cài đặt ứng dụng trên ảnh hệ thống Android 5.0, kiểm thử ứng dụng rồi phát hành ứng dụng đã cập nhật với thay đổi này.

Bạn có thể sử dụng API Android 5.0 mà vẫn hỗ trợ các phiên bản cũ bằng cách thêm điều kiện vào mã để kiểm tra cấp độ API hệ thống trước khi thực thi các API không được minSdkVersion của bạn hỗ trợ. Để tìm hiểu thêm về cách duy trì khả năng tương thích ngược, hãy đọc bài viết Hỗ trợ các phiên bản nền tảng khác nhau.

Để biết thêm thông tin về cách hoạt động của các cấp độ API, hãy đọc bài viết Cấp độ API là gì?

Thay đổi quan trọng về hành vi

Nếu bạn từng phát hành ứng dụng dành cho Android, hãy lưu ý rằng các thay đổi trong Android 5.0 có thể ảnh hưởng đến ứng dụng của bạn.

Vui lòng xem Các thay đổi đối với Android 5.0 để biết thông tin đầy đủ.

Giao diện người dùng

Hỗ trợ Material Design

Android 5.0 hỗ trợ thêm cho kiểu Material Design mới của Android. Bạn có thể tạo các ứng dụng có thiết kế Material Design sinh động và có các chuyển đổi thành phần trên giao diện người dùng tạo cảm giác tự nhiên cho người dùng. Hoạt động hỗ trợ này bao gồm:

  • Chủ đề Material
  • Xem bóng
  • Tiện ích RecyclerView
  • Hiệu ứng ảnh động và định kiểu có thể vẽ
  • Ảnh động và hiệu ứng chuyển đổi hoạt động trong Material Design
  • Ảnh động cho thuộc tính khung hiển thị dựa trên trạng thái của khung hiển thị
  • Tiện ích có thể tuỳ chỉnh trên giao diện người dùng và thanh ứng dụng với bảng màu do bạn kiểm soát
  • Các đối tượng có thể vẽ ở dạng ảnh động và không động dựa trên đồ hoạ vectơ XML

Để tìm hiểu thêm về cách thêm chức năng Material Design vào ứng dụng của bạn, hãy xem nội dung Material Design.

Các tài liệu và hoạt động đồng thời trong màn hình gần đây

Trong các bản phát hành trước, màn hình gần đây chỉ có thể hiển thị một tác vụ đối với mỗi ứng dụng mà người dùng tương tác gần đây nhất. Giờ đây, ứng dụng của bạn có thể mở thêm tác vụ nếu cần cho các hoạt động đồng thời bổ sung cho tài liệu. Tính năng này hỗ trợ chế độ đa nhiệm bằng cách cho phép người dùng chuyển đổi nhanh giữa các hoạt động riêng lẻ và tài liệu từ màn hình gần đây, với trải nghiệm chuyển đổi nhất quán trên tất cả các ứng dụng. Ví dụ về những nhiệm vụ đồng thời như vậy có thể bao gồm các thẻ đang mở trong một ứng dụng trình duyệt web, tài liệu trong một ứng dụng cải thiện hiệu suất, kết quả trùng khớp đồng thời trong một trò chơi hoặc các cuộc trò chuyện trong một ứng dụng nhắn tin. Ứng dụng của bạn có thể quản lý các nhiệm vụ đó thông qua lớp ActivityManager.AppTask.

Để chèn điểm ngắt logic nhằm hệ thống coi hoạt động của bạn là một tác vụ mới, hãy sử dụng FLAG_ACTIVITY_NEW_DOCUMENT khi khởi chạy hoạt động bằng startActivity(). Bạn cũng có thể thực hiện hành vi này bằng cách đặt thuộc tính documentLaunchMode của phần tử <activity> thành "intoExisting" hoặc "always" trong tệp kê khai.

Để tránh làm lộn xộn màn hình gần đây, bạn có thể đặt số lượng tối đa tác vụ từ ứng dụng có thể xuất hiện trên màn hình đó. Để làm việc này, hãy đặt thuộc tính <application> android:maxRecents. Giới hạn tối đa hiện tại có thể được chỉ định là 50 tác vụ cho mỗi người dùng (25 tác vụ đối với các thiết bị có dung lượng RAM thấp).

Bạn có thể đặt tác vụ trong màn hình gần đây để duy trì sau khi khởi động lại. Để kiểm soát hành vi cố định, hãy sử dụng thuộc tính android:persistableMode. Bạn cũng có thể thay đổi các thuộc tính hình ảnh của một hoạt động trong màn hình gần đây, chẳng hạn như màu, nhãn và biểu tượng của hoạt động bằng cách gọi phương thức setTaskDescription().

Nội dung cập nhật về WebView

Android 5.0 cập nhật phương thức triển khai WebView cho Chromium M37, mang đến các cải tiến về tính bảo mật và độ ổn định, cũng như các bản sửa lỗi. Chuỗi tác nhân người dùng mặc định cho WebView chạy trên Android 5.0 đã được cập nhật để kết hợp 37.0.0.0 làm số phiên bản.

Bản phát hành này giới thiệu lớp PermissionRequest, cho phép ứng dụng của bạn cấp quyền WebView truy cập vào các tài nguyên được bảo vệ như máy ảnh và micrô, thông qua API web chẳng hạn như getUserMedia(). Ứng dụng của bạn phải có quyền thích hợp trên Android đối với các tài nguyên này để cấp quyền cho WebView.

Với phương thức onShowFileChooser() mới, bạn hiện có thể sử dụng trường biểu mẫu nhập trong WebView và chạy trình chọn tệp để chọn hình ảnh và tệp từ thiết bị Android.

Ngoài ra, bản phát hành này hỗ trợ các tiêu chuẩn mở WebAudio, WebGLWebRTC. Để tìm hiểu thêm về các tính năng mới có trong bản phát hành này, hãy xem bài viết WebView dành cho Android.

Chụp và chia sẻ màn hình

Android 5.0 cho phép bạn thêm các chức năng chụp ảnh màn hình và chia sẻ màn hình vào ứng dụng của mình bằng các API android.media.projection mới. Chức năng này hữu ích, chẳng hạn như khi bạn muốn bật tính năng chia sẻ màn hình trong một ứng dụng hội nghị truyền hình.

Phương thức createVirtualDisplay() mới cho phép ứng dụng của bạn chụp nội dung trên màn hình chính (màn hình mặc định) vào đối tượng Surface. Sau đó, ứng dụng của bạn có thể gửi nội dung này qua mạng. API này chỉ cho phép chụp nội dung không an toàn trên màn hình, chứ không cho phép ghi lại âm thanh hệ thống. Để bắt đầu chụp ảnh màn hình, trước tiên, ứng dụng phải yêu cầu người dùng cấp quyền bằng cách chạy hộp thoại chụp ảnh màn hình sử dụng Intent có được thông qua phương thức createScreenCaptureIntent().

Để biết ví dụ về cách sử dụng các API mới, hãy xem lớp MediaProjectionDemo trong dự án mẫu.

Thông báo

Thông báo trên màn hình khoá

Màn hình khoá trong Android 5.0 có khả năng đưa ra thông báo. Người dùng có thể chọn xem có cho phép nội dung thông báo nhạy cảm hiện trên màn hình khoá an toàn hay không qua phần Cài đặt.

Ứng dụng của bạn có thể kiểm soát mức độ chi tiết hiển thị khi thông báo của ứng dụng xuất hiện trên màn hình khoá bảo mật. Để kiểm soát mức độ hiển thị, hãy gọi setVisibility() và chỉ định một trong các giá trị sau:

  • VISIBILITY_PRIVATE: Hiển thị thông tin cơ bản (chẳng hạn như biểu tượng của thông báo) nhưng ẩn toàn bộ nội dung của thông báo.
  • VISIBILITY_PUBLIC: Hiện toàn bộ nội dung của thông báo.
  • VISIBILITY_SECRET: Không hiển thị gì, ngoại trừ biểu tượng của thông báo.

Khi cấp độ hiển thị là VISIBILITY_PRIVATE, bạn cũng có thể cung cấp một phiên bản đã loại bỏ dữ liệu của nội dung thông báo nhằm ẩn thông tin cá nhân. Ví dụ: ứng dụng SMS có thể hiển thị thông báo "Bạn có 3 tin nhắn văn bản mới" nhưng lại ẩn nội dung tin nhắn và người gửi. Để cung cấp thông báo thay thế này, trước tiên, hãy tạo thông báo thay thế bằng Notification.Builder. Khi bạn tạo đối tượng thông báo riêng tư, hãy đính kèm thông báo thay thế vào đối tượng đó thông qua phương thức setPublicVersion().

Siêu dữ liệu về thông báo

Android 5.0 sử dụng siêu dữ liệu liên kết với thông báo của ứng dụng để sắp xếp thông báo một cách thông minh hơn. Để đặt siêu dữ liệu, hãy gọi các phương thức sau trong Notification.Builder khi bạn tạo thông báo:

  • setCategory(): Cho hệ thống biết cách xử lý các thông báo của ứng dụng khi thiết bị đang ở chế độ ưu tiên (ví dụ: nếu thông báo biểu thị cuộc gọi đến, tin nhắn nhanh hoặc chuông báo).
  • setPriority(): Đánh dấu thông báo là quan trọng hơn hoặc ít quan trọng hơn thông báo thông thường. Các thông báo có trường mức độ ưu tiên được đặt thành PRIORITY_MAX hoặc PRIORITY_HIGH sẽ xuất hiện trong một cửa sổ nổi nhỏ nếu thông báo đó có cả âm thanh hoặc chế độ rung.
  • addPerson(): Cho phép bạn thêm một hoặc nhiều người có liên quan đến một thông báo. Ứng dụng của bạn có thể sử dụng thông tin này để ra tín hiệu cho hệ thống rằng ứng dụng nên nhóm các thông báo từ những người được chỉ định lại với nhau, hoặc xếp hạng thông báo từ những người này là quan trọng hơn.

Đồ hoạ

Hỗ trợ OpenGL ES 3.1

Android 5.0 bổ sung giao diện Java và dịch vụ hỗ trợ gốc cho OpenGL ES 3.1. Các chức năng chính mới được cung cấp trong OpenGL ES 3.1 bao gồm:

  • Tính toán chương trình đổ bóng
  • Riêng biệt các đối tượng trong chương trình đổ bóng
  • Lệnh vẽ gián tiếp
  • Hoạ tiết nhiều mẫu và stencil
  • Cải thiện ngôn ngữ tô bóng
  • Tiện ích cho chế độ kết hợp nâng cao và gỡ lỗi
  • Khả năng tương thích ngược với OpenGL ES 2.0 và 3.0

Giao diện Java cho OpenGL ES 3.1 trên Android được cung cấp bằng GLES31. Khi sử dụng OpenGL ES 3.1, hãy nhớ khai báo OpenGL ES 3.1 này trong tệp kê khai bằng thẻ <uses-feature> và thuộc tính android:glEsVersion. Ví dụ:

<manifest>
    <uses-feature android:glEsVersion="0x00030001" />
    ...
</manifest>

Để biết thêm thông tin về cách sử dụng OpenGL ES, bao gồm cả cách kiểm tra phiên bản OpenGL ES được hỗ trợ của thiết bị trong thời gian chạy, hãy xem Hướng dẫn về API OpenGL ES.

Gói tiện ích Android

Ngoài OpenGL ES 3.1, bản phát hành này cung cấp một gói tiện ích có giao diện Java và dịch vụ hỗ trợ gốc cho chức năng đồ hoạ nâng cao. Các tiện ích này được Android coi là một gói duy nhất. (Nếu có tiện ích ANDROID_extension_pack_es31a, ứng dụng của bạn có thể giả định tất cả tiện ích trong gói đều có mặt và bật các tính năng ngôn ngữ tô bóng bằng một câu lệnh #extension duy nhất.)

Gói tiện ích hỗ trợ:

  • Đảm bảo khả năng hỗ trợ chương trình đổ bóng mảnh cho vùng đệm lưu trữ của chương trình đổ bóng, hình ảnh và nguyên tử (không bắt buộc hỗ trợ chương trình đổ bóng mảnh trong OpenGL ES 3.1).
  • Chương trình đổ bóng hình học và Tessellation
  • Định dạng nén kết cấu ASTC (LDR)
  • Loại nội suy và đổ bóng trên mỗi mẫu
  • Chế độ hoà trộn khác nhau cho từng tệp đính kèm màu trong vùng đệm khung

Giao diện Java cho gói tiện ích được cung cấp cùng với GLES31Ext. Trong tệp kê khai ứng dụng, bạn có thể khai báo rằng ứng dụng của mình chỉ được cài đặt trên các thiết bị hỗ trợ gói tiện ích. Ví dụ:

<manifest>
    <uses-feature android:name=“android.hardware.opengles.aep”
        android:required="true" />
    ...
</manifest>

Nội dung nghe nhìn

API Camera cho các chức năng nâng cao của camera

Android 5.0 giới thiệu API android.hardware.camera2 mới nhằm hỗ trợ tính năng chụp ảnh và xử lý hình ảnh hạt chi tiết. Giờ đây, bạn có thể lập trình để truy cập vào các thiết bị máy ảnh có trong hệ thống bằng getCameraIdList() và kết nối với một thiết bị cụ thể bằng openCamera(). Để bắt đầu chụp ảnh, hãy tạo CameraCaptureSession và chỉ định các đối tượng Surface để gửi ảnh đã chụp. Bạn có thể định cấu hình CameraCaptureSession để chụp một hoặc nhiều ảnh trong một loạt ảnh.

Để nhận thông báo khi hình ảnh mới được chụp, hãy triển khai trình nghe CameraCaptureSession.CaptureCallback và thiết lập trình nghe trong yêu cầu chụp. Giờ đây, khi hệ thống hoàn tất yêu cầu chụp ảnh, trình nghe CameraCaptureSession.CaptureCallback sẽ nhận được lệnh gọi đến onCaptureCompleted(), cung cấp cho bạn siêu dữ liệu chụp ảnh trong CaptureResult.

Lớp CameraCharacteristics cho phép ứng dụng của bạn phát hiện những tính năng của máy ảnh có trên một thiết bị. Thuộc tính INFO_SUPPORTED_HARDWARE_LEVEL của đối tượng thể hiện cấp độ chức năng của máy ảnh.

  • Tất cả thiết bị đều hỗ trợ tối thiểu cấp độ phần cứng INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY. Cấp độ này có các chức năng tương đương với cấp độ của API Camera không dùng nữa.
  • Các thiết bị hỗ trợ cấp độ phần cứng INFO_SUPPORTED_HARDWARE_LEVEL_FULL có thể tự điều khiển hoạt động chụp và xử lý hậu kỳ, cũng như chụp được những hình ảnh có độ phân giải cao ở tốc độ khung hình cao.

Để xem cách sử dụng API Camera đã cập nhật, hãy tham khảo mẫu triển khai Camera2BasicCamera2Video trong bản phát hành này.

Phát âm thanh

Bản phát hành này bao gồm những thay đổi sau đối với AudioTrack:

  • Ứng dụng của bạn hiện có thể cung cấp dữ liệu âm thanh ở định dạng dấu phẩy động (ENCODING_PCM_FLOAT). Điều này cho phép dải động lớn hơn, độ chính xác nhất quán hơn và khoảng trần lớn hơn. Số học dấu phẩy động đặc biệt hữu ích trong các phép tính trung gian. Điểm cuối phát sử dụng định dạng số nguyên cho dữ liệu âm thanh và có độ sâu bit thấp hơn. (Trong Android 5.0, các phần của quy trình nội bộ chưa phải là dấu phẩy động.)
  • Ứng dụng của bạn hiện có thể cung cấp dữ liệu âm thanh dưới dạng ByteBuffer, ở cùng định dạng mà MediaCodec cung cấp.
  • Tuỳ chọn WRITE_NON_BLOCKING có thể đơn giản hoá việc lưu vào bộ đệm và đa luồng cho một số ứng dụng.

Điều khiển chế độ phát nội dung đa phương tiện

Hãy sử dụng các API nội dung nghe nhìn và thông báo mới để đảm bảo rằng giao diện người dùng hệ thống biết về việc phát nội dung nghe nhìn của bạn, đồng thời có thể trích xuất và hiển thị ảnh bìa đĩa nhạc. Giờ đây, việc điều khiển chế độ phát nội dung nghe nhìn trên một giao diện người dùng và một dịch vụ trở nên dễ dàng hơn nhờ các lớp MediaSessionMediaController mới.

Lớp MediaSession mới thay thế lớp RemoteControlClient đã ngừng hoạt động và cung cấp một tập hợp các phương pháp gọi lại duy nhất để xử lý các nút điều khiển truyền tải và các nút nội dung nghe nhìn. Nếu ứng dụng của bạn cung cấp tính năng phát nội dung nghe nhìn và chạy trên nền tảng Android TV hoặc Wear, hãy sử dụng lớp MediaSession để xử lý các chế độ điều khiển truyền tải bằng các phương thức gọi lại tương tự.

Giờ đây, bạn có thể tạo ứng dụng trình điều khiển nội dung nghe nhìn của riêng mình bằng lớp MediaController mới. Lớp này cung cấp một cách an toàn cho luồng để giám sát và kiểm soát việc phát nội dung nghe nhìn từ quy trình giao diện người dùng của ứng dụng. Khi tạo tay điều khiển, hãy chỉ định đối tượng MediaSession.Token để ứng dụng của bạn có thể tương tác với MediaSession đã cho. Khi sử dụng các phương thức MediaController.TransportControls, bạn có thể gửi các lệnh như play(), stop(), skipToNext()setRating() để điều khiển chế độ phát nội dung nghe nhìn trong phiên đó. Với tay điều khiển, bạn cũng có thể đăng ký đối tượng MediaController.Callback để theo dõi siêu dữ liệu và các thay đổi về trạng thái trên phiên.

Ngoài ra, bạn có thể tạo các thông báo chi tiết cho phép điều khiển chế độ phát được liên kết với một phiên phát nội dung đa phương tiện bằng lớp Notification.MediaStyle mới.

Duyệt qua nội dung nghe nhìn

Android 5.0 mang đến cho các ứng dụng khả năng duyệt qua thư viện nội dung đa phương tiện của một ứng dụng khác, thông qua API android.media.browse mới. Để hiển thị nội dung nghe nhìn trong ứng dụng, hãy mở rộng lớp MediaBrowserService. Khi triển khai MediaBrowserService, bạn cần cấp quyền truy cập vào MediaSession.Token để các ứng dụng có thể phát nội dung nghe nhìn do dịch vụ của bạn cung cấp.

Để tương tác với một dịch vụ trình duyệt nội dung đa phương tiện, hãy sử dụng lớp MediaBrowser. Chỉ định tên thành phần cho MediaSession khi bạn tạo một thực thể MediaBrowser. Khi sử dụng phiên bản trình duyệt đó, ứng dụng của bạn có thể kết nối với dịch vụ liên kết và lấy đối tượng MediaSession.Token để phát nội dung hiển thị thông qua dịch vụ đó.

Lưu trữ

Lựa chọn thư mục

Android 5.0 mở rộng Khung truy cập bộ nhớ (Storage Access Framework) để cho phép người dùng chọn toàn bộ cây con thư mục, cấp cho ứng dụng quyền đọc/ghi vào tất cả tài liệu được chứa mà không yêu cầu người dùng xác nhận đối với từng mục.

Để chọn một cây con của thư mục, hãy tạo và gửi ý định OPEN_DOCUMENT_TREE. Hệ thống sẽ hiển thị tất cả các thực thể DocumentsProvider hỗ trợ lựa chọn cây con, cho phép người dùng duyệt qua và chọn một thư mục. URI được trả về biểu thị quyền truy cập vào cây con đã chọn. Sau đó, bạn có thể sử dụng buildChildDocumentsUriUsingTree()buildDocumentUriUsingTree() cùng với query() để khám phá cây con.

Phương thức createDocument() mới cho phép bạn tạo tài liệu hoặc thư mục mới ở bất kỳ đâu trong cây con. Để quản lý các tài liệu hiện có, hãy sử dụng renameDocument()deleteDocument(). Hãy kiểm tra COLUMN_FLAGS để xác minh khả năng hỗ trợ của nhà cung cấp cho các lệnh gọi này trước khi thực hiện chúng.

Nếu bạn đang triển khai DocumentsProvider và muốn hỗ trợ việc lựa chọn cây con, hãy triển khai isChildDocument() và đưa FLAG_SUPPORTS_IS_CHILD vào COLUMN_FLAGS.

Android 5.0 cũng giới thiệu các thư mục mới dành riêng cho gói trên bộ nhớ dùng chung, nơi ứng dụng của bạn có thể đặt các tệp nội dung nghe nhìn để đưa vào MediaStore. getExternalMediaDirs() mới sẽ trả về đường dẫn đến các thư mục này trên mọi thiết bị lưu trữ dùng chung. Tương tự như getExternalFilesDir(), ứng dụng của bạn không cần thêm quyền để truy cập vào các đường dẫn được trả về. Nền tảng định kỳ quét tìm nội dung nghe nhìn mới trong các thư mục này, nhưng bạn cũng có thể sử dụng MediaScannerConnection để quét tìm nội dung mới một cách rõ ràng.

Không dây và kết nối

Nhiều kết nối mạng

Android 5.0 cung cấp các API đa mạng mới cho phép ứng dụng của bạn tự động quét tìm các mạng có sẵn với tính năng cụ thể và thiết lập kết nối với các mạng đó. Chức năng này sẽ hữu ích khi ứng dụng của bạn cần một mạng chuyên biệt, chẳng hạn như mạng CAPL, MMS hoặc mạng thanh toán qua nhà mạng, hoặc nếu bạn muốn gửi dữ liệu bằng một loại giao thức truyền tải cụ thể.

Để chọn và kết nối động với một mạng từ ứng dụng của bạn, hãy làm theo các bước sau:

  1. Tạo ConnectivityManager.
  2. Sử dụng lớp NetworkRequest.Builder để tạo một đối tượng NetworkRequest và chỉ định các tính năng mạng cũng như loại truyền tải mà ứng dụng của bạn quan tâm.
  3. Để quét tìm các mạng phù hợp, hãy gọi requestNetwork() hoặc registerNetworkCallback(), đồng thời truyền đối tượng NetworkRequest và phương thức triển khai ConnectivityManager.NetworkCallback. Sử dụng phương thức requestNetwork() nếu bạn muốn chủ động chuyển sang một mạng phù hợp sau khi phát hiện mạng đó; để chỉ nhận thông báo về các mạng đã quét mà không cần chủ động chuyển đổi, hãy sử dụng phương thức registerNetworkCallback().

Khi phát hiện thấy một mạng phù hợp, hệ thống sẽ kết nối với mạng đó và thực hiện lệnh gọi lại onAvailable(). Bạn có thể sử dụng đối tượng Network từ lệnh gọi lại để nhận thêm thông tin về mạng hoặc để hướng lưu lượng truy cập sử dụng mạng đã chọn.

Bluetooth năng lượng thấp

Android 4.3 đã ra mắt tính năng hỗ trợ nền tảng cho Bluetooth năng lượng thấp (Bluetooth LE) trong vai trò trung tâm. Trong Android 5.0, thiết bị Android giờ đây có thể hoạt động như một thiết bị ngoại vi Bluetooth LE. Các ứng dụng có thể sử dụng tính năng này để cho các thiết bị ở gần biết đến sự hiện diện của ứng dụng. Ví dụ: bạn có thể tạo các ứng dụng cho phép một thiết bị hoạt động như máy đếm bước hoặc thiết bị theo dõi sức khoẻ đồng thời giao tiếp dữ liệu của thiết bị đó với một thiết bị Bluetooth LE khác.

API android.bluetooth.le mới cho phép ứng dụng của bạn phát quảng cáo, quét tìm phản hồi và kết nối biểu mẫu với các thiết bị Bluetooth LE ở gần. Để sử dụng các tính năng quảng cáo và quét mới, hãy thêm quyền BLUETOOTH_ADMIN vào tệp kê khai. Khi người dùng cập nhật hoặc tải ứng dụng của bạn xuống từ Cửa hàng Play, họ sẽ được yêu cầu cấp quyền sau cho ứng dụng của bạn: "Thông tin kết nối Bluetooth: Cho phép ứng dụng kiểm soát Bluetooth, bao gồm cả việc truyền phát hoặc nhận thông tin về các thiết bị Bluetooth ở gần".

Để bắt đầu quảng cáo Bluetooth LE để các thiết bị khác có thể khám phá ứng dụng của bạn, hãy gọi startAdvertising() và truyền vào hoạt động triển khai lớp AdvertiseCallback. Đối tượng gọi lại nhận được báo cáo về sự thành công hay thất bại của hoạt động quảng cáo.

Android 5.0 ra mắt lớp ScanFilter để ứng dụng của bạn chỉ có thể quét tìm các loại thiết bị cụ thể mà ứng dụng đó quan tâm. Để bắt đầu quét tìm thiết bị Bluetooth LE, hãy gọi startScan() và chuyển vào một danh sách bộ lọc. Trong lệnh gọi phương thức, bạn cũng phải cung cấp phương thức triển khai ScanCallback để báo cáo thời điểm tìm thấy quảng cáo Bluetooth LE.

Cải tiến NFC

Android 5.0 bổ sung các cải tiến sau để cho phép sử dụng NFC rộng hơn và linh hoạt hơn:

  • Android Beam hiện có sẵn trong trình đơn chia sẻ.
  • Ứng dụng của bạn có thể gọi Android Beam trên thiết bị của người dùng để chia sẻ dữ liệu bằng cách gọi invokeBeam(). Điều này giúp người dùng không cần phải đặt thiết bị vào một thiết bị khác có hỗ trợ NFC để hoàn tất quá trình chuyển dữ liệu theo cách thủ công.
  • Bạn có thể dùng phương thức createTextRecord() mới để tạo bản ghi NDEF chứa dữ liệu văn bản UTF-8.
  • Nếu đang phát triển một ứng dụng thanh toán, thì bạn hiện có thể đăng ký mã ứng dụng NFC (AID) một cách linh động bằng cách gọi registerAidsForService(). Bạn cũng có thể sử dụng setPreferredService() để đặt dịch vụ mô phỏng thẻ ưu tiên mà bạn nên sử dụng khi một hoạt động cụ thể chạy ở nền trước.

Dự án Volta

Ngoài các tính năng mới, Android 5.0 nhấn mạnh những cải tiến về thời lượng pin. Hãy dùng các API và công cụ mới để tìm hiểu cũng như tối ưu hoá mức tiêu thụ điện năng của ứng dụng.

Lên lịch cho lệnh

Android 5.0 cung cấp một API JobScheduler mới cho phép bạn tối ưu hoá thời lượng pin bằng cách xác định các công việc để hệ thống chạy không đồng bộ vào thời điểm sau này hoặc trong các điều kiện đã chỉ định (chẳng hạn như khi thiết bị đang sạc). Lên lịch công việc sẽ hữu ích trong những trường hợp như sau:

  • Ứng dụng có những công việc không dành cho người dùng mà bạn có thể trì hoãn.
  • Ứng dụng có công việc bạn muốn thực hiện khi đã cắm thiết bị.
  • Ứng dụng có một tác vụ cần đến quyền truy cập mạng hoặc kết nối Wi-Fi.
  • Ứng dụng có một số tác vụ mà bạn muốn chạy dưới dạng hàng loạt theo lịch biểu thông thường.

Một đơn vị công việc được đối tượng JobInfo đóng gói. Đối tượng này chỉ định tiêu chí lập lịch.

Sử dụng lớp JobInfo.Builder để định cấu hình cách chạy tác vụ đã lên lịch. Bạn có thể lên lịch để chạy tác vụ trong những điều kiện cụ thể, chẳng hạn như:

  • Bắt đầu khi thiết bị đang sạc
  • Bắt đầu khi thiết bị kết nối với một mạng không đo lượng dữ liệu
  • Bắt đầu khi thiết bị ở trạng thái rảnh
  • Hoàn tất trước một thời hạn nhất định hoặc với độ trễ tối thiểu

Ví dụ: bạn có thể thêm mã như sau để chạy tác vụ của mình trên một mạng không đo lượng dữ liệu:

Kotlin

val uploadTask: JobInfo = JobInfo.Builder(
        jobId,
        serviceComponent /* JobService component */
).run {
    setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    build()
}
val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(uploadTask)

Java

JobInfo uploadTask = new JobInfo.Builder(jobId,
                                         serviceComponent /* JobService component */)
        .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_UNMETERED)
        .build();
JobScheduler jobScheduler =
        (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(uploadTask);

Nếu thiết bị có nguồn điện ổn định (nghĩa là thiết bị đã được cắm nguồn trong hơn 2 phút và pin ở mức tốt), thì hệ thống sẽ chạy mọi công việc theo lịch đã sẵn sàng chạy, ngay cả khi thời hạn của công việc chưa hết hạn.

Để xem ví dụ về cách sử dụng API JobScheduler, hãy tham khảo mẫu triển khai JobSchedulerSample trong bản phát hành này.

Công cụ cho nhà phát triển về mức sử dụng pin

Lệnh dumpsys batterystats mới tạo ra dữ liệu thống kê thú vị về mức sử dụng pin trên một thiết bị, được sắp xếp theo mã nhận dạng người dùng riêng biệt (UID). Số liệu thống kê bao gồm:

  • Nhật ký các sự kiện liên quan đến pin
  • Số liệu thống kê chung cho thiết bị
  • Mức sử dụng nguồn ước tính trên mỗi UID và thành phần hệ thống
  • Số mili giây trên mỗi gói của thiết bị di động trên mỗi ứng dụng
  • Số liệu thống kê tổng hợp UID của hệ thống
  • Số liệu thống kê tổng hợp UID của ứng dụng

Sử dụng tuỳ chọn --help để tìm hiểu về các tuỳ chọn khác nhau để điều chỉnh kết quả đầu ra. Ví dụ: để in số liệu thống kê về mức sử dụng pin cho một gói ứng dụng nhất định kể từ lần sạc thiết bị gần đây nhất, hãy chạy lệnh sau:

$ adb shell dumpsys batterystats --charged <package-name>

Bạn có thể sử dụng công cụ Battery Historian trên kết quả của lệnh dumpsys để tạo hình ảnh HTML về các sự kiện liên quan đến nguồn trong nhật ký. Thông tin này giúp bạn hiểu và chẩn đoán mọi vấn đề liên quan đến pin một cách dễ dàng hơn.

Android tại nơi làm việc và trong lĩnh vực giáo dục

Cấp phép được quản lý

Android 5.0 cung cấp chức năng mới để chạy các ứng dụng trong môi trường doanh nghiệp. Quản trị viên thiết bị có thể bắt đầu một quy trình cấp phép được quản lý để thêm một hồ sơ được quản lý đồng thời nhưng riêng biệt vào một thiết bị, nếu người dùng đã có tài khoản cá nhân. Các ứng dụng liên kết với hồ sơ được quản lý sẽ xuất hiện cùng với các ứng dụng không được quản lý trong Trình chạy, màn hình các mục gần đây và thông báo của người dùng.

Để bắt đầu quy trình cấp phép được quản lý, hãy gửi ACTION_PROVISION_MANAGED_PROFILE trong Intent. Nếu lệnh gọi thành công, hệ thống sẽ kích hoạt lệnh gọi lại onProfileProvisioningComplete(). Sau đó, bạn có thể gọi setProfileEnabled() để bật hồ sơ được quản lý này.

Theo mặc định, chỉ một nhóm nhỏ các ứng dụng được bật trong hồ sơ được quản lý. Bạn có thể cài đặt thêm các ứng dụng khác trong hồ sơ được quản lý bằng cách gọi enableSystemApp().

Nếu đang phát triển ứng dụng Trình chạy, bạn có thể sử dụng lớp LauncherApps mới để lấy danh sách các hoạt động có thể khởi chạy cho người dùng hiện tại và mọi hồ sơ được quản lý liên kết. Trình chạy của bạn có thể giúp các ứng dụng được quản lý trở nên nổi bật bằng cách thêm huy hiệu công việc vào biểu tượng có thể vẽ. Để truy xuất biểu tượng được gắn huy hiệu, hãy gọi getUserBadgedIcon().

Để xem cách sử dụng chức năng mới này, hãy tham khảo mẫu triển khai BasicManagedProfile trong bản phát hành này.

Chủ sở hữu thiết bị

Android 5.0 mang đến khả năng triển khai ứng dụng của chủ sở hữu thiết bị. Chủ sở hữu thiết bị là một loại quản trị viên thiết bị chuyên biệt có thêm khả năng tạo và xoá người dùng phụ cũng như định cấu hình các chế độ cài đặt chung trên thiết bị. Ứng dụng của chủ sở hữu thiết bị có thể dùng các phương thức trong lớp DevicePolicyManager để kiểm soát chi tiết cấu hình, tính bảo mật và ứng dụng trên thiết bị được quản lý. Một thiết bị chỉ có thể có một chủ sở hữu thiết bị đang hoạt động tại một thời điểm.

Để triển khai và kích hoạt chủ sở hữu thiết bị, bạn phải thực hiện quá trình chuyển dữ liệu NFC từ một ứng dụng lập trình sang thiết bị khi thiết bị ở trạng thái chưa được cấp phép. Quá trình chuyển dữ liệu này gửi thông tin giống như trong ý định cấp phép được mô tả trong phần Cấp phép được quản lý.

Ghim màn hình

Android 5.0 ra mắt một API ghim màn hình mới cho phép bạn tạm thời hạn chế người dùng rời khỏi tác vụ hoặc bị thông báo làm gián đoạn. Ví dụ: bạn có thể sử dụng giải pháp này nếu đang phát triển một ứng dụng giáo dục để hỗ trợ các yêu cầu đánh giá có mức độ rủi ro cao trên Android, hoặc một ứng dụng một mục đích hay ứng dụng kiosk. Sau khi ứng dụng của bạn kích hoạt tính năng ghim màn hình, người dùng sẽ không thể xem thông báo, truy cập vào các ứng dụng khác hoặc quay lại màn hình chính cho đến khi ứng dụng của bạn thoát khỏi chế độ đó.

Có hai cách để kích hoạt tính năng ghim màn hình:

  • Theo cách thủ công: Người dùng có thể bật tính năng ghim màn hình trong phần Cài đặt > Bảo mật > Ghim màn hình và chọn các thao tác họ muốn ghim bằng cách chạm vào biểu tượng ghim màu xanh lục trên màn hình gần đây.
  • Theo phương thức lập trình: Để kích hoạt tính năng ghim màn hình theo phương thức lập trình, hãy gọi startLockTask() từ ứng dụng của bạn. Nếu ứng dụng yêu cầu không phải là chủ sở hữu thiết bị, thì người dùng sẽ được nhắc xác nhận. Ứng dụng của chủ sở hữu thiết bị có thể gọi phương thức setLockTaskPackages() để cho phép ghim ứng dụng mà không cần bước xác nhận của người dùng.

Khi tính năng khoá tác vụ đang hoạt động, hành vi sau đây sẽ xảy ra:

  • Thanh trạng thái trống và các thông báo cho người dùng cũng như thông tin trạng thái bị ẩn.
  • Nút Trang chủ và nút Ứng dụng gần đây bị ẩn.
  • Các ứng dụng khác không thể chạy hoạt động mới.
  • Ứng dụng hiện tại có thể bắt đầu hoạt động mới, miễn là việc này không tạo ra tác vụ mới.
  • Khi tính năng ghim màn hình được chủ sở hữu thiết bị gọi, người dùng sẽ vẫn bị khoá đối với ứng dụng của bạn cho đến khi ứng dụng này gọi stopLockTask().
  • Nếu một ứng dụng khác không phải là chủ sở hữu thiết bị hoặc do người dùng trực tiếp kích hoạt tính năng ghim màn hình, thì người dùng có thể thoát bằng cách giữ cả nút Quay lại và Gần đây.

Khung in

Kết xuất PDF dưới dạng bitmap

Giờ đây, bạn có thể kết xuất các trang tài liệu PDF thành hình ảnh bitmap để in bằng cách sử dụng lớp PdfRenderer mới. Bạn phải chỉ định một ParcelFileDescriptor có thể tìm kiếm (nghĩa là nội dung có thể được truy cập ngẫu nhiên) mà trên đó hệ thống ghi nội dung có thể in. Ứng dụng của bạn có thể lấy một trang để kết xuất bằng openPage(), sau đó gọi render() để chuyển PdfRenderer.Page đã mở thành một bitmap. Bạn cũng có thể đặt các tham số bổ sung nếu chỉ muốn chuyển đổi một phần tài liệu thành hình ảnh bitmap (ví dụ: để triển khai tính năng kết xuất theo ô để phóng to tài liệu).

Để biết ví dụ về cách sử dụng các API mới, hãy xem mẫu PdfRendererBasic.

Hệ thống

Số liệu thống kê sử dụng ứng dụng

Giờ đây, bạn có thể truy cập vào nhật ký sử dụng ứng dụng trên thiết bị Android bằng API android.app.usage mới. API này cung cấp thông tin chi tiết hơn về việc sử dụng so với phương thức getRecentTasks() không dùng nữa. Để sử dụng API này, trước tiên, bạn phải khai báo quyền "android.permission.PACKAGE_USAGE_STATS" trong tệp kê khai. Người dùng cũng phải cấp quyền truy cập cho ứng dụng này thông qua phần Cài đặt > Bảo mật > Ứng dụng bằng quyền truy cập vào dữ liệu sử dụng.

Hệ thống thu thập dữ liệu sử dụng trên cơ sở từng ứng dụng, tổng hợp dữ liệu theo khoảng thời gian hằng ngày, hằng tuần, hằng tháng và hằng năm. Thời lượng tối đa mà hệ thống lưu giữ dữ liệu này như sau:

  • Dữ liệu hằng ngày: 7 ngày
  • Dữ liệu hằng tuần: 4 tuần
  • Dữ liệu hằng tháng: 6 tháng
  • Dữ liệu hằng năm: 2 năm

Đối với mỗi ứng dụng, hệ thống sẽ ghi lại dữ liệu sau đây:

  • Lần gần đây nhất ứng dụng được sử dụng
  • Tổng thời lượng ứng dụng chạy ở nền trước trong khoảng thời gian đó (theo ngày, tuần, tháng hoặc năm)
  • Ghi lại dấu thời gian khi một thành phần (xác định bằng tên gói và hoạt động) được di chuyển lên nền trước hoặc nền trong một ngày
  • Ghi lại dấu thời gian khi một cấu hình thiết bị thay đổi (chẳng hạn như khi hướng thiết bị thay đổi do xoay)

Thử nghiệm và hỗ trợ tiếp cận

Thử nghiệm và cải thiện khả năng hỗ trợ tiếp cận

Android 5.0 bổ sung tính năng hỗ trợ sau cho việc kiểm thử và hỗ trợ tiếp cận:

  • Các phương thức getWindowAnimationFrameStats()getWindowContentFrameStats() mới ghi lại số liệu thống kê về khung cho ảnh động và nội dung cửa sổ. Các phương thức này cho phép bạn viết các chương trình kiểm thử đo lường để đánh giá xem ứng dụng có đang kết xuất khung hình ở tần suất làm mới đủ để mang lại trải nghiệm người dùng mượt mà hay không.
  • Phương thức executeShellCommand() mới cho phép bạn thực thi các lệnh shell trong kiểm thử đo lường. Việc thực thi lệnh cũng tương tự như chạy adb shell trên một máy chủ lưu trữ được kết nối với thiết bị, cho phép bạn sử dụng các công cụ dựa trên shell như dumpsys, am, contentpm.
  • Giờ đây, các dịch vụ hỗ trợ tiếp cận và công cụ kiểm thử sử dụng các API hỗ trợ tiếp cận (chẳng hạn như UiAutomator) có thể truy xuất thông tin chi tiết về các thuộc tính của cửa sổ trên màn hình mà người dùng khi mắt có thể tương tác. Để truy xuất danh sách đối tượng AccessibilityWindowInfo, hãy gọi phương thức getWindows() mới.
  • Lớp AccessibilityNodeInfo.AccessibilityAction mới cho phép bạn xác định các thao tác chuẩn hoặc tuỳ chỉnh để thực hiện trên AccessibilityNodeInfo. Lớp AccessibilityNodeInfo.AccessibilityAction mới thay thế các API liên quan đến hành động đã tìm thấy trước đó trong AccessibilityNodeInfo.
  • Android 5.0 cung cấp khả năng kiểm soát chi tiết hơn việc tổng hợp văn bản sang lời nói trong ứng dụng của bạn. Lớp Voice mới cho phép ứng dụng của bạn dùng hồ sơ giọng nói liên quan đến các ngôn ngữ, điểm xếp hạng chất lượng và độ trễ cụ thể, cũng như các tham số cụ thể của công cụ chuyển văn bản sang lời nói.

IME

Chuyển đổi dễ dàng hơn giữa các ngôn ngữ nhập

Kể từ Android 5.0, người dùng có thể dễ dàng chuyển đổi giữa tất cả trình chỉnh sửa phương thức nhập (IME) mà nền tảng hỗ trợ. Việc thực hiện thao tác chuyển đổi đã chỉ định (thường nhấn vào biểu tượng Quả cầu trên bàn phím mềm) sẽ chu kỳ qua tất cả các IME như vậy. Thay đổi về hành vi này được triển khai bằng phương thức shouldOfferSwitchingToNextInputMethod().

Ngoài ra, khung giờ đây sẽ kiểm tra xem IME tiếp theo có cơ chế chuyển đổi hay không (và do đó, liệu IME đó có hỗ trợ chuyển sang IME sau đó hay không). Một IME có cơ chế chuyển đổi sẽ không chuyển sang một IME không có cơ chế đó. Thay đổi về hành vi này được triển khai bằng phương thức switchToNextInputMethod().

Để xem ví dụ về cách sử dụng các API chuyển đổi IME đã cập nhật, hãy tham khảo mẫu triển khai bàn phím mềm được cập nhật trong bản phát hành này. Để tìm hiểu thêm về cách triển khai quá trình chuyển đổi giữa các IME, hãy xem bài viết Tạo phương thức nhập.

Khai báo tệp kê khai

Các tính năng bắt buộc có thể khai báo

Các giá trị sau hiện đã được hỗ trợ trong phần tử <uses-feature>. Nhờ đó, bạn có thể đảm bảo rằng ứng dụng chỉ được cài đặt trên các thiết bị cung cấp các tính năng mà ứng dụng cần.

Quyền của người dùng

Phần tử <uses-permission> hiện đã hỗ trợ quyền sau đây để khai báo những quyền mà ứng dụng của bạn yêu cầu để truy cập vào một số API.

  • BIND_DREAM_SERVICE: Khi nhắm mục tiêu đến API cấp 21 trở lên, dịch vụ Daydream cần có quyền này để đảm bảo chỉ hệ thống mới có thể liên kết với API đó.