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 về các API mới đáng chú ý nhất.

Nếu bạn đã phát hành ứng dụng, hãy nhớ xem Thay đổi về hành vi của Android 5.0 mà bạn nên tính đến trong ứng dụng. 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 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.

Để biết thông tin tổng quan về các tính năng mới của nền tảng, hãy xem các điểm nổi bật của Android Lollipop.

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

Để bắt đầu xây dựng ứng dụng cho Android 5.0, trước tiên, bạn phải tải SDK Android xuống. Sau đó, sử dụng Trình quản lý SDK để tải Nền tảng SDK Android 5.0 và Hình ảnh hệ thống 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 tốt 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 hình ảnh hệ thống Android 5.0, kiểm thử ứng dụng đó, sau đó 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 trong khi vẫn hỗ trợ các phiên bản cũ bằng cách thêm các điều kiện vào mã để kiểm tra cấp độ API hệ thống trước khi thực thi những API không được minSdkVersion 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ợ nhiều phiên bản nền tảng.

Để 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ì?

Những thay đổi quan trọng về hành vi

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

Vui lòng xem phần 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 bổ sung tính năng hỗ trợ cho kiểu thiết kế Material mới của Android. Bạn có thể tạo ứng dụng có thiết kế Material Design linh hoạt về mặt hình ảnh và có hiệu ứng 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. Dịch vụ hỗ trợ này bao gồm:

  • Giao diện Material
  • Xem bóng
  • Tiện ích RecyclerView
  • Ảnh động có thể vẽ và hiệu ứng tạo kiểu
  • Hiệu ứng chuyển đổi hoạt động và ảnh động Material Design
  • Trình tạo ảnh động cho các thuộc tính thành phần hiển thị dựa trên trạng thái của thành phần hiển thị
  • Các tiện ích giao diện người dùng và thanh ứng dụng có thể tuỳ chỉnh với bảng màu do bạn kiểm soát
  • Đối tượng có thể vẽ động và tĩnh 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 trên 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ụ cho 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) để bổ sung thêm các hoạt động đồng thời cho tài liệu. Tính năng này hỗ trợ nhiều thao tác bằng cách cho phép người dùng nhanh chóng chuyển đổi giữa các hoạt động và tài liệu riêng lẻ trên 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ề các tác vụ đồng thời như vậy có thể bao gồm các thẻ đang mở trong ứng dụng trình duyệt web, tài liệu trong ứng dụng nâng cao năng suất, các trận đấu đồng thời trong trò chơi hoặc cuộc trò chuyện trong ứng dụng nhắn tin. Ứng dụng của bạn có thể quản lý các tác vụ thông qua lớp ActivityManager.AppTask.

Để chèn một điểm ngắt logic để 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ể xem 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 công việc từ ứng dụng có thể xuất hiện trên màn hình đó. Để thực hiện việc này, hãy đặt thuộc tính <application> android:maxRecents. Số lượng tác vụ tối đa hiện có thể chỉ định là 50 tác vụ cho mỗi người dùng (25 tác vụ cho thiết bị có dung lượng RAM thấp).

Bạn có thể đặt các 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 trên 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().

Bản cập nhật WebView

Android 5.0 cập nhật phương thức triển khai WebView cho Chromium M37, mang đến các điểm cải tiến về 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 để đưa 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 các API web như getUserMedia(). Ứng dụng của bạn phải có các quyền Android thích hợp cho các tài nguyên này để cấp quyền cho WebView.

Với phương thức onShowFileChooser() mới, giờ đây, bạ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 trên 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 cho Android.

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

Android 5.0 cho phép bạn thêm tính 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 thông qua các API android.media.projection mới. Chức năng này rất hữu ích, chẳng hạn như nếu bạn muốn bật tính năng chia sẻ màn hình trong ứ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 của 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 đối tượng này qua mạng. API này chỉ cho phép chụp nội dung màn hình không an toàn chứ không phải âm thanh hệ thống. Để bắt đầu chụp ảnh màn hình, trước tiên, ứng dụng của bạn 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 bằng Intent thu đượ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 hiển thị thông báo. Người dùng có thể chọn trong phần Cài đặt xem có cho phép hiển thị nội dung thông báo nhạy cảm trên màn hình khoá bảo mật hay không.

Ứng dụng có thể kiểm soát mức độ hiển thị chi tiết khi thông báo của ứng dụng hiển thị 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 thị 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 phiên bản đã loại bỏ dữ liệu của nội dung thông báo để ẩ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 ẩ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ị ở chế độ ưu tiên (ví dụ: nếu một thông báo cho biết 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 hay kém quan trọng hơn thông báo thông thường. 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ũng có âm thanh hoặc 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 để báo cho hệ thống biết 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ợ riêng cho OpenGL ES 3.1. Chức năng chính mới được cung cấp trong OpenGL ES 3.1 bao gồm:

  • Chương trình đổ bóng điện toán
  • Tách riêng các đối tượng trong chương trình đổ bóng
  • Lệnh vẽ gián tiếp
  • Kết cấu nhiều mẫu và bản in mờ
  • Cải tiế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 cùng với GLES31. Khi sử dụng OpenGL ES 3.1, hãy nhớ khai báo 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 còn 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. Android coi các tiện ích này 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ể cho rằng tất cả tiện ích trong gói đều hiện diện 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 này hỗ trợ:

  • Đảm bảo hỗ trợ chương trình đổ bóng mảnh cho vùng đệm bộ nhớ chương trình đổ bóng, hình ảnh và nguyên tử (Không bắt buộc phải hỗ trợ chương trình đổ bóng mảnh trong OpenGL ES 3.1.)
  • Tessellation và chương trình đổ bóng hình học
  • Định dạng nén kết cấu ASTC (LDR)
  • Nội suy và tô bóng trên mỗi mẫu
  • Các chế độ kết hợp 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 bạn chỉ phải cài đặt ứng dụng 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

Camera API (API Máy ảnh) cho các tính năng nâng cao của máy ảnh

Android 5.0 giới thiệu API android.hardware.camera2 mới để hỗ trợ việc chụp ảnh và xử lý hình ảnh chi tiết. Giờ đây, bạn có thể truy cập vào các thiết bị máy ảnh có sẵn cho hệ thống bằng cách lập trình với 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 một 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 này trong yêu cầu chụp của bạn. Bây giờ, khi hệ thống hoàn tất yêu cầu chụp ảnh, trình nghe CameraCaptureSession.CaptureCallback sẽ nhận được một 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 máy ảnh có trên 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ó các tính năng gần tương đương với cấp độ phần cứng của Camera API 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ể kiểm soát thủ công quá trình chụp và xử lý hậu kỳ, cũng như chụp ả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 các 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 các 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 phạm vi độ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.)
  • Giờ đây, ứng dụng của bạn có thể cung cấp dữ liệu âm thanh dưới dạng ByteBuffer, ở cùng định dạng do 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 nghe nhìn

Hãy sử dụng các API thông báo và API nội dung nghe nhìn mới để đảm bảo rằng giao diện người dùng hệ thống biết về chế độ 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, bạn có thể dễ dàng điều khiển chế độ phát nội dung nghe nhìn trên giao diện người dùng và dịch vụ bằng các lớp MediaSessionMediaController mới.

Lớp MediaSession mới thay thế lớp RemoteControlClient không dùng nữa và cung cấp một nhóm phương thức gọi lại duy nhất để xử lý các nút điều khiển truyền tải và 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 đa phương tiệ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 nút điều khiển truyền tải bằng cách sử dụng cùng một phương thức gọi lại.

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 qua quy trình giao diện người dùng của ứng dụng. Khi tạo trình điều khiển, hãy chỉ định một đối tượng MediaSession.Token để ứng dụng của bạn có thể tương tác với MediaSession đã cho. Bằng cách 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 việc phát nội dung nghe nhìn trong phiên đó. Với trình điều khiển, bạn cũng có thể đăng ký một đối tượng MediaController.Callback để theo dõi siêu dữ liệu và các thay đổi về trạng thái trong phiên.

Ngoài ra, bạn có thể tạo thông báo đa dạng thức cho phép điều khiển chế độ phát tied to a media session (được liên kết với một phiên phát nội dung nghe nhìn) bằng lớp Notification.MediaStyle mới.

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

Android 5.0 cung cấp cho các ứng dụng khả năng duyệt qua thư viện nội dung nghe nhì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 của bạn, hãy mở rộng lớp MediaBrowserService. Việc triển khai MediaBrowserService phải cung cấp quyền truy cập vào MediaSession.Token để các ứng dụng có thể phát nội dung đa phương tiện được cung cấp thông qua dịch vụ của bạn.

Để tương tác với 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. Bằng cách sử dụng thực thể trình duyệt đó, ứng dụng của bạn có thể kết nối với dịch vụ được liên kết và lấy đối tượng MediaSession.Token để phát nội dung được hiển thị qua dịch vụ đó.

Bộ nhớ

Lựa chọn thư mục

Android 5.0 mở rộng Khung truy cập bộ nhớ để 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ó trong đó mà không cần người dùng xác nhận cho 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ợ chọn cây con, cho phép người dùng duyệt xem và chọn một thư mục. URI trả về thể hiện 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 các tài liệu hoặc thư mục mới ở bất kỳ vị trí nào trong cây con. Để quản lý các tài liệu hiện có, hãy 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 đối với các lệnh gọi này trước khi thực hiện các lệnh gọi đó.

Nếu bạn đang triển khai DocumentsProvider và muốn hỗ trợ 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 trả về đường dẫn đến các thư mục này trên tất cả thiết bị bộ nhớ dùng chung. Tương tự như getExternalFilesDir(), ứng dụng của bạn không cần thêm quyền nào để truy cập vào các đường dẫn được trả về. Nền tảng này đị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 những chức 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 rất hữu ích khi ứng dụng của bạn cần có một mạng chuyên biệt, chẳng hạn như mạng supL, 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 linh động với một mạng từ ứng dụng, hãy làm theo các bước sau:

  1. Tạo ConnectivityManager.
  2. 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(), sau đó truyền đối tượng NetworkRequest và phương thức triển khai ConnectivityManager.NetworkCallback. Hãy 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 khi phát hiện thấy mạng. Để chỉ nhận thông báo cho 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à gọi 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 để chuyển 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) ở vai trò trung tâm. Trong Android 5.0, thiết bị Android hiện có thể hoạt động như một thiết bị ngoại vi Bluetooth LE. Ứng dụng có thể sử dụng tính năng này để cho các thiết bị ở gần biết sự hiện diện của mình. Ví dụ: bạn có thể xây dựng các ứng dụng cho phép thiết bị hoạt động như một máy đếm bước hoặc thiết bị theo dõi sức khoẻ và 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 sóng quảng cáo, quét tìm phản hồi và tạo kết nối với các thiết bị Bluetooth LE ở gần. Để sử dụng các tính năng quét và quảng cáo 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 đây 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 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 qua 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 phương thức triển khai lớp AdvertiseCallback. Đối tượng gọi lại nhận được báo cáo về việc thao tác quảng cáo thành công hay không thành công.

Android 5.0 giới thiệu lớp ScanFilter để ứng dụng của bạn chỉ có thể quét 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à truyền vào danh sách bộ lọc. Trong lệnh gọi phương thức, bạn cũng phải cung cấp một cách triển khai ScanCallback để báo cáo khi tìm thấy quảng cáo Bluetooth LE.

Các tính năng nâng cao của NFC

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

  • Android Beam hiện có 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 tránh việc người dùng phải nhấn thủ công vào thiết bị của một thiết bị khác có hỗ trợ NFC để hoàn tất quá trình chuyển dữ liệu.
  • Bạn có thể sử dụng phương thức createTextRecord() mới để tạo một 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, giờ đây, bạn có thể đăng ký mã nhận dạng ứng dụng NFC (AID) một cách linh động bằng cách gọi registerAidsForService(). Bạn cũng có thể dùng setPreferredService() để đặt dịch vụ mô phỏng thẻ ưu tiên được dùng khi một hoạt động cụ thể đang chạy ở nền trước.

Dự án Volta

Ngoài các tính năng mới, Android 5.0 chú trọng vào những điểm cải tiến về thời lượng pin. Sử dụng các API và công cụ mới để hiểu rõ và tối ưu hoá mức tiêu thụ điện năng của ứng dụng.

Đang lên lịch công việc

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 lúc khác hoặc trong các điều kiện cụ thể (chẳng hạn như khi thiết bị đang sạc). Việc lên lịch công việc sẽ hữu ích trong những trường hợp như:

  • Ứng dụng có công việc không liên quan đến người dùng mà bạn có thể trì hoãn.
  • Ứng dụng có công việc mà bạn muốn thực hiện khi thiết bị được cắm điện.
  • Ứng dụng có một nhiệm vụ cần có kết nối 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 một lô theo lịch biểu thông thường.

Một đơn vị công việc được đóng gói bằng đối tượng JobInfo. Đối tượng này chỉ định tiêu chí lên 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ụ theo các đ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 thành 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à đã cắm sạc hơn 2 phút và pin ở mức pin tốt), hệ thống sẽ chạy mọi công việc đã lên 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.

Để 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 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 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 để điều chỉnh kết quả. 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 từ nhật ký. Thông tin này giúp bạn dễ dàng hiểu và chẩn đoán mọi vấn đề liên quan đến pin.

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 ứng dụng trong môi trường doanh nghiệp. Quản trị viên thiết bị có thể bắt đầu quy trình cấp phép được quản lý để thêm một hồ sơ được quản lý đồng hành nhưng riêng biệt vào thiết bị, nếu người dùng hiện có tài khoản cá nhân. Các ứng dụng được 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 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 số ít ứng dụng được bật trong hồ sơ được quản lý. Bạn có thể cài đặt thêm ứng dụng 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 để nhận 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ý được liên kết. Trình chạy của bạn có thể làm cho các ứng dụng được quản lý nổi bật một cách trực quan 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ó huy hiệu, hãy gọi getUserBadgedIcon().

Để biết cách sử dụng chức năng mới, 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 ra mắt tính năng triển khai ứng dụng 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 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 các thiết bị được quản lý. Tại mỗi thời điểm, mỗi thiết bị chỉ có thể có một chủ sở hữu thiết bị đang hoạt động.

Để triển khai và kích hoạt chủ sở hữu thiết bị, bạn phải thực hiện chuyển dữ liệu NFC từ một ứng dụng lập trình sang thiết bị trong khi thiết bị đang ở trạng thái chưa được cấp phép. Quá trình chuyển dữ liệu này sẽ gửi cùng một thông tin 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 giới thiệu 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ụ của bạn hoặc bị các thông báo làm gián đoạn. Ví dụ: bạn có thể sử dụng thuộc tính 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á mang tính rủi ro cao trên Android, hoặc một ứng dụng kiosk hay ứng dụng đơn mục đích. 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ế độ này.

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

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

Khung in

Kết xuất tệp 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 (tức là nội dung có thể được truy cập ngẫu nhiên) mà hệ thống sẽ 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 bitmap. Bạn cũng có thể đặt các thông 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 xếp kề nhằm 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ề cách 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 dữ liệu sử dụng.

Hệ thống thu thập dữ liệu sử dụng trên cơ sở mỗi ứ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 những dữ liệu sau:

  • Lần sử dụng ứng dụng gần đây nhất
  • Tổng thời gian ứ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 (được xác định bằng tên gói và hoạt động) chuyển sang nền trước hoặc nền trong ngày
  • Ghi lại dấu thời gian khi 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

Cải tiến về khả năng hỗ trợ tiếp cận và kiểm thử

Android 5.0 bổ sung tính năng hỗ trợ sau đây cho hoạt động 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 một ứ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 mượt mà cho người dùng hay không.
  • Phương thức executeShellCommand() mới cho phép bạn thực thi các lệnh shell từ kiểm thử đo lường. Quá trình thực thi lệnh tương tự như chạy adb shell từ một máy chủ lưu trữ đã 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.
  • Hiện tại, các dịch vụ hỗ trợ tiếp cận và công cụ kiểm thử sử dụng 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 nhìn thấy có thể tương tác. Để truy xuất danh sách các đố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 thao tác trước đó trong AccessibilityNodeInfo.
  • Android 5.0 mang đến khả năng kiểm soát chi tiết hơn đối với quá trình tổng hợp văn bản sang lời nói trong ứng dụng. Lớp Voice mới cho phép ứng dụng của bạn dùng các hồ sơ giọng nói liên kết với các ngôn ngữ, xếp hạng chất lượng và độ trễ cụ thể cũng như các tham số dành riêng cho công cụ chuyển văn bản sang lời nói.

IME

Dễ dàng chuyển đổi 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 được chỉ định (thường chạm 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 này hiện kiểm tra xem IME tiếp theo có bao gồm 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 IMEI có cơ chế chuyển đổi sẽ không chuyển đổi sang một IME nếu không có cơ chế này. 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ậ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 phần Tạo phương thức nhập.

Nội dung khai báo trong 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>, vì vậy, 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ủa bạn cần.

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

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

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