API Android 3.0

Cấp độ API: 11

Đối với các nhà phát triển, nền tảng Android 3.0 (HONEYCOMB) có sẵn dưới dạng một thành phần có thể tải xuống cho SDK Android. Nền tảng có thể tải xuống bao gồm thư viện Android và hình ảnh hệ thống, cũng như một bộ giao diện trình mô phỏng và nhiều nội dung khác. Nền tảng có thể tải xuống không bao gồm thư viện bên ngoài.

Đối với các nhà phát triển, nền tảng Android 3.0 có sẵn dưới dạng một thành phần có thể tải xuống cho SDK Android. Nền tảng có thể tải xuống bao gồm thư viện Android và hình ảnh hệ thống, cũng như một bộ giao diện trình mô phỏng và nhiều nội dung khác. Để bắt đầu phát triển hoặc kiểm thử trên Android 3.0, hãy sử dụng Trình quản lý SDK Android để tải nền tảng này xuống SDK của bạn.

Tổng quan về API

Các phần dưới đây cung cấp tổng quan kỹ thuật về các tính năng mới dành cho nhà phát triển trong Android 3.0, bao gồm các tính năng mới và các thay đổi trong API khung kể từ phiên bản trước.

Mảnh

Mảnh là một thành phần khung mới cho phép bạn tách riêng các phần tử riêng biệt của một hoạt động thành các mô-đun độc lập xác định giao diện người dùng và vòng đời riêng của các phần tử đó. Để tạo một mảnh, bạn phải mở rộng lớp Fragment và triển khai một số phương thức gọi lại trong vòng đời, tương tự như Activity. Sau đó, bạn có thể kết hợp nhiều mảnh trong một hoạt động để tạo giao diện người dùng nhiều ngăn, trong đó mỗi ngăn quản lý vòng đời và hoạt động đầu vào của người dùng riêng.

Bạn cũng có thể sử dụng một mảnh mà không cần cung cấp giao diện người dùng mà thay vào đó, hãy sử dụng mảnh làm trình thực thi cho hoạt động, chẳng hạn như để quản lý tiến trình tải xuống chỉ xảy ra khi hoạt động đang chạy.

Ngoài ra:

  • Các mảnh độc lập và bạn có thể sử dụng lại trong nhiều hoạt động
  • Bạn có thể thêm, xoá, thay thế và tạo ảnh động cho các mảnh bên trong hoạt động
  • Bạn có thể thêm các mảnh vào ngăn xếp lui do hoạt động quản lý, duy trì trạng thái của các mảnh khi chúng thay đổi và cho phép người dùng quay lại qua các trạng thái khác nhau
  • Bằng cách cung cấp bố cục thay thế, bạn có thể kết hợp và khớp các mảnh, dựa trên kích thước màn hình và hướng
  • Các mảnh có quyền truy cập trực tiếp vào hoạt động vùng chứa của chúng và có thể đóng góp các mục vào Thanh thao tác của hoạt động (sẽ thảo luận tiếp theo)

Để quản lý các mảnh trong hoạt động, bạn phải sử dụng FragmentManager, cung cấp một số API để tương tác với các mảnh, chẳng hạn như tìm mảnh trong hoạt động và kéo mảnh ra khỏi ngăn xếp lui để khôi phục trạng thái trước đó.

Để thực hiện một giao dịch, chẳng hạn như thêm hoặc xoá một mảnh, bạn phải tạo một FragmentTransaction. Sau đó, bạn có thể gọi các phương thức như add() remove() hoặc replace(). Sau khi áp dụng tất cả thay đổi muốn thực hiện cho giao dịch này, bạn phải gọi commit() và hệ thống sẽ áp dụng giao dịch mảnh cho hoạt động.

Để biết thêm thông tin về cách sử dụng mảnh, hãy đọc tài liệu về Mảnh. Một số mẫu cũng có trong ứng dụng Bản minh hoạ API.

Thanh thao tác

Thanh tác vụ là sự thay thế cho thanh tiêu đề truyền thống ở đầu cửa sổ hoạt động. Biểu trưng này bao gồm biểu trưng ứng dụng ở góc bên trái và cung cấp giao diện mới cho các mục trong Trình đơn tuỳ chọn. Ngoài ra, Thanh thao tác cho phép bạn:

  • Thêm các mục trong trình đơn trực tiếp vào Thanh tác vụ dưới dạng "mục hành động".

    Trong phần khai báo XML cho mục trong trình đơn, hãy thêm thuộc tính android:showAsAction có giá trị "ifRoom". Khi có đủ chỗ, mục trong trình đơn sẽ xuất hiện ngay trên Thanh hành động. Nếu không, mục sẽ được đặt trong trình đơn mục bổ sung, hiển thị bằng biểu tượng trình đơn ở bên phải Thanh thao tác.

  • Thay thế mục hành động bằng một tiện ích (chẳng hạn như hộp tìm kiếm) – tạo "chế độ xem hành động".

    Trong phần khai báo XML cho mục trong trình đơn, hãy thêm thuộc tính android:actionViewLayout với tài nguyên bố cục hoặc thuộc tính android:actionViewClass có tên lớp của tiện ích. (Bạn cũng phải khai báo thuộc tính android:showAsAction để mục đó xuất hiện trong Thanh thao tác.) Nếu không có đủ khoảng trống trong Thanh thao tác và mục đó xuất hiện trong trình đơn mục bổ sung, thì mục đó sẽ hoạt động như một mục trong trình đơn thông thường và không hiển thị tiện ích.

  • Thêm một thao tác vào biểu trưng của ứng dụng và thay thế bằng biểu trưng tuỳ chỉnh

    Biểu trưng ứng dụng được tự động gán mã nhận dạng android.R.id.home. Mã này được hệ thống gửi đến lệnh gọi lại onOptionsItemSelected() của hoạt động khi bạn chạm vào. Bạn chỉ cần phản hồi mã nhận dạng này trong phương thức gọi lại để thực hiện một thao tác, chẳng hạn như chuyển đến hoạt động "trang chủ" của ứng dụng.

    Để thay thế biểu tượng bằng một biểu trưng, hãy chỉ định biểu trưng của ứng dụng trong tệp kê khai bằng thuộc tính android:logo, sau đó gọi setDisplayUseLogoEnabled(true) trong hoạt động của bạn.

  • Thêm breadcrumb (tập hợp liên kết phân cấp) để di chuyển lùi thông qua ngăn xếp lui của các mảnh
  • Thêm thẻ hoặc danh sách thả xuống để di chuyển qua các mảnh
  • Tuỳ chỉnh Thanh thao tác bằng giao diện và nền

Thanh thao tác là tiêu chuẩn cho tất cả ứng dụng sử dụng giao diện ba chiều mới. Thanh thao tác này cũng là tiêu chuẩn khi bạn đặt android:minSdkVersion hoặc android:targetSdkVersion thành "11".

Để biết thêm thông tin về Thanh thao tác, hãy đọc tài liệu về Thanh thao tác. Một số mẫu cũng có trong ứng dụng Bản minh hoạ API.

Bảng nhớ tạm của hệ thống

Giờ đây, các ứng dụng có thể sao chép và dán dữ liệu (không chỉ văn bản đơn thuần) vào và từ bảng nhớ tạm trên toàn hệ thống. Dữ liệu bị cắt có thể là văn bản thuần tuý, URI hoặc ý định.

Bằng cách cấp cho hệ thống quyền truy cập vào dữ liệu bạn muốn người dùng sao chép, thông qua một nhà cung cấp nội dung, người dùng có thể sao chép nội dung phức tạp (chẳng hạn như hình ảnh hoặc cấu trúc dữ liệu) từ ứng dụng của bạn rồi dán vào một ứng dụng khác có hỗ trợ loại nội dung đó.

Để bắt đầu sử dụng bảng nhớ tạm, hãy lấy đối tượng ClipboardManager chung bằng cách gọi getSystemService(CLIPBOARD_SERVICE).

Để sao chép một mục vào bảng nhớ tạm, bạn cần tạo một đối tượng ClipData mới. Đối tượng này chứa một hoặc nhiều đối tượng ClipData.Item, trong đó mỗi đối tượng mô tả một thực thể. Để tạo một đối tượng ClipData chỉ chứa một ClipData.Item, bạn có thể sử dụng một trong các phương thức trợ giúp, chẳng hạn như newPlainText(), newUri()newIntent(). Các phương thức này sẽ trả về một đối tượng ClipData được tải sẵn bằng ClipData.Item mà bạn cung cấp.

Để thêm ClipData vào bảng nhớ tạm, hãy truyền nó vào setPrimaryClip() cho thực thể ClipboardManager của bạn.

Sau đó, bạn có thể đọc tệp từ bảng nhớ tạm (để dán tệp đó) bằng cách gọi getPrimaryClip() trên ClipboardManager. Việc xử lý ClipData bạn nhận được có thể phức tạp và bạn cần đảm bảo rằng mình thực sự có thể xử lý được loại dữ liệu trong bảng nhớ tạm trước khi thử dán.

Bảng nhớ tạm chỉ lưu giữ mỗi lần một phần dữ liệu bị cắt (đối tượng ClipData), nhưng một ClipData có thể chứa nhiều ClipData.Item.

Để biết thêm thông tin, hãy đọc tài liệu Sao chép và dán. Bạn cũng có thể xem cách triển khai đơn giản cho thao tác sao chép và dán trong mẫu minh hoạ API và cách triển khai hoàn chỉnh hơn trong mẫu Note Pad.

Kéo và thả

API mới đơn giản hoá các thao tác kéo và thả trong giao diện người dùng của ứng dụng. Thao tác kéo là hoạt động chuyển một loại dữ liệu (được thực hiện trong đối tượng ClipData) từ vị trí này sang vị trí khác. Điểm bắt đầu và kết thúc của thao tác kéo là View, vì vậy, các API trực tiếp xử lý thao tác kéo và thả nằm trong lớp View.

Thao tác kéo và thả có vòng đời được xác định bằng một số thao tác kéo (mỗi thao tác được một đối tượng DragEvent xác định), chẳng hạn như ACTION_DRAG_STARTED, ACTION_DRAG_ENTEREDACTION_DROP. Mỗi khung hiển thị muốn tham gia vào một thao tác kéo có thể theo dõi các thao tác này.

Để bắt đầu kéo nội dung trong hoạt động của bạn, hãy gọi startDrag() trên View, cung cấp một đối tượng ClipData đại diện cho dữ liệu cần kéo, View.DragShadowBuilder để tạo điều kiện cho "đổ bóng" mà người dùng nhìn thấy dưới ngón tay khi kéo và Object có thể chia sẻ thông tin về đối tượng kéo với các thành phần hiển thị có thể nhận đối tượng.

Để chấp nhận đối tượng kéo trong View (nhận "drop"), hãy đăng ký khung hiển thị với OnDragListener bằng cách gọi setOnDragListener(). Khi một sự kiện kéo xảy ra trên khung hiển thị, hệ thống sẽ gọi onDrag() cho OnDragListener, nhận DragEvent mô tả loại thao tác kéo đã xảy ra (chẳng hạn như ACTION_DRAG_STARTED, ACTION_DRAG_ENTEREDACTION_DROP). Trong quá trình kéo, hệ thống liên tục gọi onDrag() cho khung hiển thị bên dưới thao tác kéo để phân phối luồng các sự kiện kéo. Khung hiển thị nhận có thể yêu cầu loại sự kiện được gửi đến onDragEvent() bằng cách gọi getAction() trên DragEvent.

Lưu ý: Mặc dù sự kiện kéo có thể chứa đối tượng ClipData, nhưng sự kiện này không liên quan đến bảng nhớ tạm của hệ thống. Không được đưa dữ liệu đã kéo vào bảng nhớ tạm của hệ thống khi thực hiện thao tác kéo và thả.

Để biết thêm thông tin, hãy đọc tài liệu về Kéo và thả. Bạn cũng có thể xem cách triển khai thao tác kéo và thả trong ứng dụng API minh hoạ và ứng dụng Honeycomb Gallery.

Tiện ích ứng dụng

Android 3.0 hỗ trợ một số lớp tiện ích mới để tăng tính tương tác của các tiện ích ứng dụng trên Màn hình chính của người dùng, bao gồm: GridView, ListView, StackView, ViewFlipperAdapterViewFlipper.

Quan trọng hơn, bạn có thể sử dụng RemoteViewsService mới để tạo các tiện ích ứng dụng có bộ sưu tập, bằng cách dùng các tiện ích như GridView, ListViewStackView được hỗ trợ bởi dữ liệu từ xa, chẳng hạn như của một nhà cung cấp nội dung.

Lớp AppWidgetProviderInfo (được xác định trong XML có phần tử <appwidget-provider>) cũng hỗ trợ hai trường mới: autoAdvanceViewIdpreviewImage. Trường autoAdvanceViewId cho phép bạn chỉ định mã chế độ xem của chế độ xem phụ tiện ích ứng dụng sẽ được máy chủ lưu trữ của tiện ích ứng dụng tự động nâng cao. Trường previewImage chỉ định bản xem trước tiện ích ứng dụng và hiển thị cho người dùng từ bộ chọn tiện ích. Nếu trường này không được cung cấp, thì biểu tượng của tiện ích ứng dụng sẽ được dùng cho bản xem trước.

Để giúp tạo hình ảnh xem trước cho tiện ích ứng dụng của bạn (để chỉ định trong trường previewImage), trình mô phỏng Android có một ứng dụng có tên "Xem trước tiện ích". Để tạo hình ảnh xem trước, hãy chạy ứng dụng này, chọn tiện ích ứng dụng cho ứng dụng và thiết lập cách bạn muốn hình ảnh xem trước xuất hiện, sau đó lưu và đặt hình ảnh đó vào tài nguyên có thể vẽ của ứng dụng.

Bạn có thể xem cách triển khai các tính năng mới của tiện ích ứng dụng trong các ứng dụng Tiện ích ứng dụng StackViewTiện ích danh sách thời tiết.

Thông báo trên thanh trạng thái

Các API Notification đã được mở rộng để hỗ trợ thêm nhiều thông báo trên thanh trạng thái có nội dung phong phú, ngoài ra với một lớp Notification.Builder mới cho phép bạn dễ dàng tạo các đối tượng Notification.

Các tính năng mới gồm có:

  • Hỗ trợ một biểu tượng lớn trong thông báo, bằng cách sử dụng setLargeIcon(). Thao tác này thường để các ứng dụng xã hội hiển thị ảnh liên hệ của người là nguồn thông báo hoặc cho các ứng dụng đa phương tiện hiển thị hình thu nhỏ của album.
  • Hỗ trợ bố cục tuỳ chỉnh trong hình đầu dòng của thanh trạng thái, sử dụng setTicker().
  • Hỗ trợ bố cục thông báo tuỳ chỉnh để bao gồm các nút có PendingIntent, cho các tiện ích thông báo giàu tính tương tác hơn. Ví dụ: thông báo có thể điều khiển chế độ phát nhạc mà không cần bắt đầu một hoạt động.

Trình tải nội dung

Các API khung mới hỗ trợ việc tải dữ liệu không đồng bộ bằng cách sử dụng lớp Loader. Bạn có thể sử dụng API này kết hợp với các thành phần giao diện người dùng như khung hiển thị và mảnh để tải động dữ liệu từ các luồng worker. Lớp con CursorLoader được thiết kế đặc biệt để giúp bạn làm điều này cho dữ liệu do ContentProvider hỗ trợ.

Bạn chỉ cần triển khai giao diện LoaderCallbacks để nhận lệnh gọi lại khi một trình tải mới được yêu cầu hoặc khi dữ liệu đã thay đổi, sau đó gọi initLoader() để khởi chạy trình tải cho hoạt động hoặc mảnh của bạn.

Để biết thêm thông tin, hãy đọc tài liệu về Trình tải. Bạn cũng có thể xem mã ví dụ bằng cách sử dụng trình tải trong các mẫu LoaderCursor LoaderThrottle.

API tai nghe và A2DP Bluetooth

Android hiện có các API cho các ứng dụng để xác minh trạng thái của Bluetooth A2DP và thiết bị có cấu hình tai nghe đã kết nối. Ví dụ: các ứng dụng có thể xác định thời điểm tai nghe Bluetooth được kết nối để nghe nhạc và thông báo cho người dùng khi thích hợp. Các ứng dụng cũng có thể nhận được thông báo về các lệnh AT cụ thể của nhà cung cấp và thông báo cho người dùng về trạng thái của thiết bị được kết nối, chẳng hạn như khi thiết bị được kết nối sắp hết pin.

Bạn có thể khởi chạy BluetoothProfile tương ứng bằng cách gọi getProfileProxy() với hằng số hồ sơ A2DP hoặc HEADSETBluetoothProfile.ServiceListener để nhận lệnh gọi lại khi ứng dụng Bluetooth được kết nối hoặc ngắt kết nối.

Khung ảnh động

Khung ảnh động hoàn toàn mới cho phép bạn tạo ảnh động cho các thuộc tính tuỳ ý của bất kỳ đối tượng nào (Khung hiển thị, Đối tượng có thể vẽ, Mảnh, Đối tượng hoặc bất kỳ đối tượng nào khác). API này cho phép bạn xác định một số khía cạnh của ảnh động, chẳng hạn như:

  • Thời lượng
  • Thời lượng và hành vi lặp lại
  • Loại nội suy thời gian
  • Trình tạo ảnh động đặt để phát các ảnh động cùng nhau, tuần tự hoặc sau độ trễ được chỉ định
  • Độ trễ làm mới khung

Theo mặc định, bạn có thể xác định các khía cạnh ảnh động này và các khía cạnh khác cho các giá trị màu int, float và thập lục phân của một đối tượng. Tức là khi một đối tượng có trường thuộc tính cho một trong các loại này, bạn có thể thay đổi giá trị của trường đó theo thời gian để ảnh hưởng đến ảnh động. Để tạo ảnh động cho bất kỳ loại giá trị nào khác, bạn sẽ cho hệ thống biết cách tính toán các giá trị cho loại cụ thể đó bằng cách triển khai giao diện TypeEvaluator.

Bạn có thể sử dụng 2 ảnh động cho các giá trị của thuộc tính: ValueAnimatorObjectAnimator. ValueAnimator tính toán các giá trị ảnh động, nhưng không nhận biết được đối tượng hoặc thuộc tính cụ thể do đó tạo ảnh động. API này chỉ thực hiện các phép tính và bạn phải theo dõi thông tin cập nhật cũng như xử lý dữ liệu bằng logic của riêng mình. ObjectAnimator là một lớp con của ValueAnimator và cho phép bạn đặt đối tượng và thuộc tính để tạo ảnh động, đồng thời xử lý mọi công việc tạo ảnh động. Tức là bạn cung cấp cho ObjectAnimator đối tượng để tạo ảnh động, thuộc tính của đối tượng sẽ thay đổi theo thời gian và một tập hợp các giá trị để áp dụng cho thuộc tính theo thời gian, sau đó bắt đầu tạo ảnh động.

Ngoài ra, lớp LayoutTransition còn bật ảnh động chuyển đổi tự động đối với các thay đổi mà bạn thực hiện đối với bố cục hoạt động. Để bật hiệu ứng chuyển đổi cho một phần bố cục, hãy tạo đối tượng LayoutTransition và đặt đối tượng đó trên bất kỳ ViewGroup nào bằng cách gọi setLayoutTransition(). Điều này giúp các ảnh động mặc định chạy bất cứ khi nào các mục được thêm vào hoặc bị xoá khỏi nhóm. Để chỉ định ảnh động tuỳ chỉnh, hãy gọi setAnimator() trên LayoutTransition và cung cấp một Animator tuỳ chỉnh, chẳng hạn như ValueAnimator hoặc ObjectAnimator đã thảo luận ở trên.

Để biết thêm thông tin, hãy xem tài liệu về Ảnh động thuộc tính. Bạn cũng có thể xem một số mẫu sử dụng API ảnh động trong ứng dụng Bản minh hoạ API.

Khung giao diện người dùng mở rộng

  • Lựa chọn trắc nghiệm cho ListView và GridView

    Chế độ CHOICE_MODE_MULTIPLE_MODAL mới cho setChoiceMode() cho phép người dùng chọn nhiều mục từ ListView hoặc GridView. Khi được sử dụng cùng với Thanh thao tác, người dùng có thể chọn nhiều mục rồi chọn thao tác cần thực hiện từ danh sách các tuỳ chọn trong Thanh thao tác (đã chuyển thành Chế độ thao tác nhiều lựa chọn).

    Để cho phép lựa chọn trắc nghiệm, hãy gọi setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) và đăng ký MultiChoiceModeListener với setMultiChoiceModeListener().

    Khi người dùng nhấn và giữ một mục, Thanh thao tác sẽ chuyển sang Chế độ thao tác nhiều lựa chọn. Hệ thống sẽ thông báo cho MultiChoiceModeListener khi các mục được chọn bằng cách gọi onItemCheckedStateChanged().

    Để biết ví dụ về lựa chọn trắc nghiệm, hãy xem lớp List15. java trong ứng dụng mẫu Bản minh hoạ API.

  • API mới để biến đổi khung hiển thị

    Các API mới cho phép bạn dễ dàng áp dụng các phép biến đổi 2D và 3D cho thành phần hiển thị trong bố cục hoạt động. Bạn có thể thực hiện các phép biến đổi mới bằng một tập hợp các thuộc tính đối tượng giúp xác định vị trí bố cục, hướng, độ trong suốt và nhiều yếu tố khác của khung hiển thị.

    Các phương thức mới để đặt thuộc tính khung hiển thị bao gồm: setAlpha(), setBottom(), setLeft(), setRight(), setBottom(), setPivotX(), setPivotY(), setRotationX(), setRotationY(), setScaleX(), setScaleY(), setAlpha() và các phương thức khác.

    Một số phương thức cũng có thuộc tính XML tương ứng mà bạn có thể chỉ định trong tệp bố cục để áp dụng phép biến đổi mặc định. Các thuộc tính hiện có bao gồm: translationX, translationY, rotation, rotationX, rotationY, scaleX, scaleY, transformPivotX, transformPivotYalpha.

    Bằng cách sử dụng một số thuộc tính khung hiển thị mới này kết hợp với khung ảnh động mới (đã thảo luận ở trên), bạn có thể dễ dàng áp dụng một số ảnh động yêu thích cho khung hiển thị của mình. Ví dụ: để xoay một khung hiển thị trên trục y, hãy cung cấp ObjectAnimator với View, thuộc tính "rotationY" cũng như giá trị bắt đầu và kết thúc:

    Kotlin

    ObjectAnimator.ofFloat(myView, "rotationY", 0f, 360f).apply {
        duration = 2000
        start()
    }
    

    Java

    ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
    animator.setDuration(2000);
    animator.start();
    
  • Giao diện ba chiều mới

    Các tiện ích hệ thống tiêu chuẩn và giao diện tổng thể đã được thiết kế lại và kết hợp với giao diện người dùng "ba chiều" mới. Hệ thống sẽ áp dụng giao diện mới bằng cách sử dụng hệ thống kiểu và giao diện tiêu chuẩn.

    Theo mặc định, mọi ứng dụng nhắm đến nền tảng Android 3.0 (bằng cách đặt giá trị android:minSdkVersion hoặc android:targetSdkVersion thành "11") đều kế thừa giao diện ba chiều. Tuy nhiên, nếu ứng dụng cũng áp dụng giao diện riêng, thì giao diện của bạn sẽ ghi đè giao diện ba chiều, trừ khi bạn cập nhật các kiểu để kế thừa giao diện ba chiều.

    Để áp dụng giao diện ba chiều cho từng hoạt động hoặc kế thừa các hoạt động đó trong định nghĩa giao diện của riêng bạn, hãy sử dụng một trong số các giao diện Theme.Holo mới. Nếu ứng dụng của bạn tương thích với phiên bản Android thấp hơn 3.0 và áp dụng các giao diện tuỳ chỉnh, thì bạn nên chọn một giao diện dựa trên phiên bản nền tảng.

  • Tiện ích mới
    • AdapterViewAnimator

      Lớp cơ sở cho AdapterView thực hiện ảnh động khi chuyển đổi giữa các khung hiển thị.

    • AdapterViewFlipper

      ViewAnimator đơn giản tạo ảnh động giữa 2 hoặc nhiều khung hiển thị đã được thêm vào. Mỗi lần chỉ hiển thị một trẻ. Nếu được yêu cầu, ứng dụng có thể tự động chuyển đổi giữa các phần tử con theo một khoảng thời gian bình thường.

    • CalendarView

      Cho phép người dùng chọn ngày từ lịch bằng cách chạm vào ngày và có thể cuộn hoặc hất lịch đến ngày mong muốn. Bạn có thể định cấu hình phạm vi ngày có sẵn trong tiện ích.

    • ListPopupWindow

      Cố định vào khung hiển thị máy chủ lưu trữ và hiển thị danh sách các lựa chọn, chẳng hạn như danh sách đề xuất khi nhập vào khung hiển thị EditText.

    • NumberPicker

      Cho phép người dùng chọn một số trong một dải ô xác định trước. Tiện ích này hiển thị một trường nhập dữ liệu cũng như các nút mũi tên lên và xuống để chọn một số. Thao tác chạm vào trường nhập dữ liệu cho phép người dùng cuộn qua các giá trị hoặc chạm lại để chỉnh sửa trực tiếp giá trị hiện tại. Mã này cũng cho phép bạn liên kết vị trí với các chuỗi để hiển thị chuỗi tương ứng thay vì vị trí chỉ mục.

    • PopupMenu

      Hiển thị Menu trong cửa sổ bật lên theo phương thức được liên kết với một khung hiển thị. Cửa sổ bật lên sẽ xuất hiện bên dưới khung hiển thị liên kết nếu có chỗ hoặc phía trên khung hiển thị liên kết nếu không có chỗ. Nếu IME (bàn phím mềm) hiển thị, thì cửa sổ bật lên sẽ không chồng lên IME cho đến khi người dùng chạm vào trình đơn.

    • SearchView

      Cung cấp một hộp tìm kiếm mà bạn có thể định cấu hình để phân phối các cụm từ tìm kiếm đến một hoạt động cụ thể và hiển thị các cụm từ tìm kiếm đề xuất (tương tự như hộp thoại tìm kiếm truyền thống). Tiện ích này đặc biệt hữu ích khi cung cấp tiện ích tìm kiếm trên Thanh thao tác. Để biết thêm thông tin, hãy xem phần Tạo giao diện tìm kiếm.

    • StackView

      Một khung hiển thị hiển thị các khung hiển thị con trong ngăn xếp 3D và cho phép người dùng vuốt qua các khung hiển thị như một rolodex.

Đồ hoạ

  • Đồ hoạ 2D được tăng tốc phần cứng

    Giờ đây, bạn có thể bật trình kết xuất OpenGL cho ứng dụng của mình bằng cách đặt android:hardwareAccelerated="true" trong phần tử <application> của phần tử tệp kê khai hoặc cho các phần tử <activity> riêng lẻ.

    Cờ này giúp các ứng dụng vẽ nhanh hơn. Điều này giúp ảnh động và khả năng cuộn mượt mà hơn, đồng thời cải thiện hiệu suất và phản hồi tổng thể khi người dùng tương tác.

  • Xem tính năng hỗ trợ các lớp phần cứng và phần mềm

    Theo mặc định, View không có lớp nào được chỉ định. Bạn có thể chỉ định rằng thành phần hiển thị được hỗ trợ bởi lớp phần cứng hoặc phần mềm, được chỉ định bằng các giá trị LAYER_TYPE_HARDWARELAYER_TYPE_SOFTWARE, bằng cách sử dụng setLayerType() hoặc thuộc tính layerType.

    Lớp phần cứng được hỗ trợ bởi một hoạ tiết dành riêng cho phần cứng (thường là Đối tượng vùng đệm khung hoặc FBO trên phần cứng OpenGL) và khiến khung hiển thị được kết xuất bằng quy trình kết xuất phần cứng của Android, nhưng chỉ khi tính năng tăng tốc phần cứng được bật cho hệ phân cấp khung hiển thị. Khi tính năng tăng tốc phần cứng bị tắt, các lớp phần cứng sẽ hoạt động giống như các lớp phần mềm.

    Lớp phần mềm được bitmap hỗ trợ và khiến khung hiển thị được kết xuất bằng quy trình kết xuất phần mềm của Android, ngay cả khi bật tính năng tăng tốc phần cứng. Bạn nên tránh sử dụng các lớp phần mềm khi cây khung hiển thị bị ảnh hưởng thường xuyên cập nhật. Mỗi bản cập nhật sẽ yêu cầu kết xuất lại lớp phần mềm (có thể bị chậm).

    Để biết thêm thông tin, hãy xem tài liệu LAYER_TYPE_HARDWARELAYER_TYPE_SOFTWARE.

  • Công cụ đồ hoạ 3D RenderScript

    Renderscript là một khung 3D thời gian chạy cung cấp cả API để xây dựng cảnh 3D cũng như một ngôn ngữ chương trình đổ bóng đặc biệt, độc lập với nền tảng để mang lại hiệu suất tối đa. Khi dùng Renderscript, bạn có thể tăng tốc các thao tác đồ hoạ và xử lý dữ liệu. Renderscript là cách lý tưởng để tạo hiệu ứng 3D hiệu suất cao cho các ứng dụng, hình nền, băng chuyền và nhiều thứ khác.

    Để biết thêm thông tin, hãy xem tài liệu về Kết xuất và tính toán 3D bằng RenderScript.

Nội dung nghe nhìn

  • Video tua nhanh thời gian

    API Máy quay video hiện hỗ trợ tính năng quay video ở chế độ tua nhanh thời gian. setCaptureRate() đặt tốc độ chụp khung hình.

  • Hỗ trợ hoạ tiết cho luồng hình ảnh

    SurfaceTexture mới cho phép bạn chụp luồng hình ảnh dưới dạng kết cấu OpenGL ES. Bằng cách gọi setPreviewTexture() cho thực thể Camera, bạn có thể chỉ định SurfaceTexture để vẽ khung hình phát video hoặc khung hình xem trước từ máy ảnh.

  • Phát trực tiếp dựa trên HTTP

    Các ứng dụng hiện có thể truyền URL danh sách phát M3U đến khung nội dung đa phương tiện để bắt đầu phiên phát trực tuyến HTTP. Khung nội dung đa phương tiện hỗ trợ hầu hết các thông số kỹ thuật phát trực tiếp qua HTTP, bao gồm cả tốc độ bit thích ứng. Vui lòng xem tài liệu về Định dạng nội dung nghe nhìn được hỗ trợ để biết thêm thông tin.

  • Dữ liệu EXIF

    ExifInterface bao gồm các trường mới về khẩu độ, ISO và thời gian phơi sáng của ảnh.

  • Cấu hình máy quay video

    Phương thức hasProfile() mới và một số cấu hình chất lượng video (chẳng hạn như QUALITY_1080P, QUALITY_720P, QUALITY_CIF và các cấu hình khác) cho phép bạn xác định các lựa chọn về chất lượng máy quay.

  • Chuyển tệp nội dung nghe nhìn kỹ thuật số

    Nền tảng này bao gồm tính năng hỗ trợ tích hợp sẵn cho Giao thức truyền nội dung nghe nhìn/hình ảnh (MTP/PTP) qua USB, cho phép người dùng dễ dàng chuyển mọi loại tệp nội dung nghe nhìn giữa các thiết bị và sang máy tính lưu trữ. Các nhà phát triển có thể xây dựng dựa trên sự hỗ trợ này, tạo các ứng dụng cho phép người dùng tạo hoặc quản lý các tệp đa phương tiện mà họ có thể muốn chuyển hoặc chia sẻ trên các thiết bị.

  • Quản lý quyền kỹ thuật số (DRM)

    Khung quản lý quyền kỹ thuật số (DRM) có thể mở rộng mới để kiểm tra và thực thi các quyền về nội dung kỹ thuật số. Tính năng này được triển khai theo hai lớp kiến trúc:

    • API khung DRM được hiển thị với các ứng dụng và chạy thông qua máy ảo Dalvik cho các ứng dụng tiêu chuẩn.
    • Trình quản lý DRM của mã gốc triển khai API khung và hiển thị giao diện cho các trình bổ trợ DRM để xử lý việc quản lý quyền và giải mã cho nhiều lược đồ DRM.

    Đối với nhà phát triển ứng dụng, khung này cung cấp một API hợp nhất và trừu tượng giúp đơn giản hoá việc quản lý nội dung được bảo vệ. API này giúp ẩn sự phức tạp của các hoạt động DRM và cho phép một chế độ hoạt động nhất quán cho cả nội dung được bảo vệ và không được bảo vệ, cũng như trên nhiều lược đồ DRM.

    Đối với nhà sản xuất thiết bị, chủ sở hữu nội dung và nhà cung cấp nội dung đa phương tiện kỹ thuật số Internet, API trình bổ trợ của khung DRM cung cấp một phương thức để thêm tính năng hỗ trợ cho lược đồ DRM (lựa chọn) vào hệ thống Android, để thực thi biện pháp bảo vệ nội dung một cách an toàn.

    Bản phát hành xem trước không cung cấp trình bổ trợ DRM gốc nào để kiểm tra và thực thi quyền kỹ thuật số. Tuy nhiên, các nhà sản xuất thiết bị có thể gửi kèm trình bổ trợ DRM kèm theo thiết bị của họ.

    Bạn có thể tìm thấy tất cả các API DRM trong gói android.drm.

Hỗ trợ bàn phím

  • Hỗ trợ các phím bổ trợ Control, Meta, Caps Lock, Num Lock và Scroll Lock. Để biết thêm thông tin, hãy xem META_CTRL_ON và các trường liên quan.
  • Hỗ trợ bàn phím đầy đủ kiểu máy tính để bàn, bao gồm cả tính năng hỗ trợ các phím như Escape, Home, End, Delete và các phím khác. Bạn có thể xác định xem các sự kiện chính có đến từ một bàn phím đầy đủ hay không bằng cách truy vấn getKeyboardType() và kiểm tra KeyCharacterMap.FULL
  • TextView nay hỗ trợ cắt, sao chép, dán và chọn tất cả dựa trên bàn phím bằng cách sử dụng các tổ hợp phím Control+X, Control+C, Control+V và Control+A. Tính năng này cũng hỗ trợ PageUp/PageDown, Home/End và lựa chọn văn bản dựa trên bàn phím.
  • KeyEvent thêm một số phương thức mới để giúp bạn dễ dàng kiểm tra trạng thái của đối tượng sửa đổi phím một cách chính xác và nhất quán. Hãy xem hasModifiers(int), hasNoModifiers(), metaStateHasModifiers(), metaStateHasNoModifiers().
  • Các ứng dụng có thể triển khai phím tắt tuỳ chỉnh bằng cách phân lớp con Activity, Dialog hoặc View và triển khai onKeyShortcut(). Khung sẽ gọi phương thức này bất cứ khi nào một phím được kết hợp với phím Control. Khi tạo Trình đơn tuỳ chọn, bạn có thể đăng ký phím tắt bằng cách đặt thuộc tính android:alphabeticShortcut hoặc android:numericShortcut cho từng phần tử <item> (hoặc bằng setShortcut()).
  • Android 3.0 bao gồm một thiết bị "bàn phím ảo" mới có mã KeyCharacterMap.VIRTUAL_KEYBOARD. Bàn phím ảo có bản đồ phím Hoa Kỳ kiểu máy tính để bàn. Sơ đồ này hữu ích cho việc tổng hợp các sự kiện chính để kiểm thử dữ liệu đầu vào.

Sự kiện chạm phân tách

Trước đây, tại một thời điểm chỉ có một khung hiển thị có thể chấp nhận các sự kiện chạm. Android 3.0 bổ sung tính năng hỗ trợ phân tách các sự kiện chạm trên các khung hiển thị và thậm chí cả các cửa sổ, nhờ đó, các khung hiển thị khác nhau có thể chấp nhận các sự kiện chạm đồng thời.

Các sự kiện chạm phân tách được bật theo mặc định khi một ứng dụng nhắm đến Android 3.0. Tức là khi ứng dụng đã đặt giá trị của thuộc tính android:minSdkVersion hoặc android:targetSdkVersion thành "11".

Tuy nhiên, các thuộc tính sau cho phép bạn tắt các sự kiện chạm phân tách trên các thành phần hiển thị bên trong các nhóm thành phần hiển thị cụ thể và trên nhiều cửa sổ.

  • Thuộc tính android:splitMotionEvents cho nhóm thành phần hiển thị cho phép bạn tắt các sự kiện chạm phân tách xảy ra giữa các thành phần hiển thị con trong một bố cục. Ví dụ:
    <LinearLayout android:splitMotionEvents="false" ... >
        ...
    </LinearLayout>
    

    Bằng cách này, các khung hiển thị con trong bố cục tuyến tính không thể phân tách các sự kiện chạm – mỗi lần chỉ một khung hiển thị có thể nhận các sự kiện chạm.

  • Thuộc tính kiểu android:windowEnableSplitTouch cho phép bạn tắt các sự kiện chạm phân tách trên các cửa sổ, bằng cách áp dụng thuộc tính đó cho một giao diện của hoạt động hoặc toàn bộ ứng dụng. Ví dụ:
    <style name="NoSplitMotionEvents" parent="android:Theme.Holo">
        <item name="android:windowEnableSplitTouch">false</item>
        ...
    </style>
    

    Khi giao diện này được áp dụng cho một <activity> hoặc <application>, chỉ các sự kiện chạm trong cửa sổ hoạt động hiện tại mới được chấp nhận. Ví dụ: bằng cách tắt các sự kiện chạm chia tách giữa các cửa sổ, thanh hệ thống không thể nhận các sự kiện chạm cùng lúc với hoạt động. Điều này không ảnh hưởng đến việc khung hiển thị bên trong hoạt động có thể phân tách các sự kiện chạm hay không. Theo mặc định, hoạt động này vẫn có thể phân tách các sự kiện chạm giữa các khung hiển thị.

    Để biết thêm thông tin về cách tạo giao diện, hãy đọc phần Áp dụng kiểu và giao diện.

Chỉ số WebKit

  • Lớp WebViewFragment mới để tạo một mảnh gồm một WebView.
  • Các phương thức WebSettings mới:
    • setDisplayZoomControls() cho phép bạn ẩn các nút điều khiển thu phóng trên màn hình trong khi vẫn cho phép người dùng thu phóng bằng cử chỉ ngón tay (bạn phải đặt setBuiltInZoomControls() true).
    • Phương thức WebSettings mới, setEnableSmoothTransition(), cho phép bạn bật tính năng chuyển đổi mượt mà khi kéo và thu phóng. Khi được bật, WebView sẽ chọn một giải pháp để tối đa hoá hiệu suất (ví dụ: nội dung của WebView có thể không cập nhật trong quá trình chuyển đổi).
  • Các phương thức WebView mới:
    • Lệnh gọi lại onPause() để tạm dừng mọi quá trình xử lý liên kết với WebView khi WebView bị ẩn. Việc này rất hữu ích để giảm lưu lượng truy cập CPU hoặc mạng không cần thiết khi WebView không ở nền trước.
    • Lệnh gọi lại onResume() để tiếp tục xử lý liên kết với WebView (đã bị tạm dừng trong onPause()).
    • saveWebArchive() cho phép bạn lưu chế độ xem hiện tại dưới dạng tệp lưu trữ web trên thiết bị.
    • showFindDialog() sẽ bắt đầu một lượt tìm kiếm văn bản trong khung hiển thị hiện tại.

Trình duyệt

Ứng dụng trình duyệt thêm các tính năng sau để hỗ trợ các ứng dụng web:

  • Ghi lại nội dung nghe nhìn

    Theo quy cách HTML Media Capture (Ghi lại nội dung nghe nhìn HTML), Trình duyệt cho phép các ứng dụng web truy cập vào tính năng quay âm thanh, hình ảnh và quay video của thiết bị. Ví dụ: HTML sau đây cung cấp thông tin đầu vào để người dùng chụp ảnh để tải lên:

    <input type="file" accept="image/*;capture=camera" />
    

    Hoặc bằng cách loại trừ tham số capture=camera, người dùng có thể chọn chụp một hình ảnh mới bằng máy ảnh hoặc chọn một hình ảnh từ thiết bị (chẳng hạn như từ ứng dụng Thư viện).

  • Hướng thiết bị

    Như được xác định trong quy cách Sự kiện hướng thiết bị, Trình duyệt cho phép các ứng dụng web theo dõi các sự kiện DOM cung cấp thông tin về hướng thực tế và chuyển động của thiết bị.

    Hướng của thiết bị được biểu thị bằng trục x, y và z (theo độ) và chuyển động được biểu thị bằng dữ liệu gia tốc và tốc độ xoay. Một trang web có thể đăng ký các sự kiện hướng bằng cách gọi window.addEventListener với loại sự kiện "deviceorientation", rồi đăng ký các sự kiện chuyển động bằng cách đăng ký loại sự kiện "devicemotion".

  • Chuyển đổi CSS 3D

    Như được xác định trong thông số kỹ thuật Mô-đun chuyển đổi 3D CSS, Trình duyệt cho phép biến đổi các phần tử do CSS hiển thị theo ba chiều.

Tiện ích JSON

Các lớp mới, JsonReaderJsonWriter, giúp bạn đọc và ghi các luồng JSON. Các API mới bổ sung cho các lớp org.json, các lớp này thao tác với một tài liệu trong bộ nhớ.

Bạn có thể tạo một thực thể của JsonReader bằng cách gọi phương thức hàm khởi tạo và truyền InputStreamReader cung cấp dữ liệu cho chuỗi JSON. Sau đó, hãy bắt đầu đọc một đối tượng bằng cách gọi beginObject(), đọc tên khoá bằng nextName(), đọc giá trị bằng các phương thức tương ứng với loại khoá, chẳng hạn như nextString()nextInt(), rồi tiếp tục thực hiện như vậy trong khi hasNext() đúng.

Bạn có thể tạo một thực thể của JsonWriter bằng cách gọi hàm khởi tạo của thực thể đó và truyền OutputStreamWriter thích hợp. Sau đó, hãy ghi dữ liệu JSON theo cách tương tự như trình đọc, sử dụng name() để thêm tên thuộc tính và phương thức value() thích hợp để thêm giá trị tương ứng.

Các lớp này theo mặc định nghiêm ngặt. Phương thức setLenient() trong mỗi lớp sẽ định cấu hình các lớp đó để những nội dung đó thoải mái hơn khi chấp nhận. Chế độ phân tích cú pháp thoải mái này cũng tương thích với trình phân tích cú pháp mặc định của org.json.

Hằng số mới của tính năng

Bạn nên sử dụng phần tử manfest <uses-feature> để thông báo cho các thực thể bên ngoài (chẳng hạn như Google Play) về tập hợp tính năng phần cứng và phần mềm mà ứng dụng của bạn phụ thuộc. Trong bản phát hành này, Android thêm các hằng số mới sau đây mà các ứng dụng có thể khai báo bằng phần tử này:

  • "android.hardware.faketouch"

    Khi được khai báo, mã này cho biết ứng dụng tương thích với một thiết bị có màn hình cảm ứng mô phỏng (hoặc cao hơn). Thiết bị có màn hình cảm ứng mô phỏng cung cấp một hệ thống nhập cho người dùng có thể mô phỏng một số tính năng của màn hình cảm ứng. Ví dụ về hệ thống đầu vào như vậy là chuột hoặc điều khiển từ xa di chuyển con trỏ trên màn hình. Những hệ thống nhập như vậy hỗ trợ các sự kiện chạm cơ bản như nhấp xuống, nhấp lên và kéo. Tuy nhiên, các loại đầu vào phức tạp hơn (chẳng hạn như các cử chỉ, cử chỉ hất, v.v.) có thể khó hoặc không thực hiện được trên thiết bị cảm ứng giả (và chắc chắn bạn không thể sử dụng cử chỉ đa điểm).

    Nếu ứng dụng không yêu cầu các cử chỉ phức tạp và bạn không muốn ứng dụng bị lọc khỏi các thiết bị có màn hình cảm ứng mô phỏng, thì bạn nên khai báo "android.hardware.faketouch" bằng phần tử <uses-feature>. Bằng cách này, ứng dụng của bạn sẽ được phân phối cho nhiều loại thiết bị nhất, bao gồm cả những loại thiết bị chỉ cung cấp phương thức nhập màn hình cảm ứng mô phỏng.

    Tất cả các thiết bị có màn hình cảm ứng cũng hỗ trợ "android.hardware.faketouch", vì các chức năng của màn hình cảm ứng là tập hợp lớn nhất của các tính năng cảm ứng giả. Do đó, trừ phi thực sự cần đến màn hình cảm ứng, bạn nên thêm phần tử <uses-feature> cho cảm ứng giả.

Các quyền mới

  • "android.permission.BIND_REMOTEVIEWS"

    Bạn phải khai báo quyền này dưới dạng quyền bắt buộc trong phần tử tệp kê khai <service> để triển khai RemoteViewsService. Ví dụ: khi tạo một Tiện ích ứng dụng sử dụng RemoteViewsService để điền sẵn khung hiển thị bộ sưu tập, mục nhập tệp kê khai có thể có dạng như sau:

    <service android:name=".widget.WidgetService"
        android:exported="false"
        android:permission="android.permission.BIND_REMOTEVIEWS" />
    

Công nghệ nền tảng mới

  • Bộ nhớ
    • ext4 để bật bộ nhớ eMMC tích hợp.
    • Hệ thống tệp FUSE để hỗ trợ các thiết bị MTP.
    • Hỗ trợ chế độ USB host để hỗ trợ bàn phím và bộ chia USB.
    • Hỗ trợ MTP/PTP
  • Hạt nhân Linux
    • Nâng cấp lên 2.6.36
  • Máy ảo Dalvik
    • Mã mới để hỗ trợ và tối ưu hoá SMP
    • Nhiều điểm cải tiến đối với cơ sở hạ tầng JIT
    • Cải tiến công cụ thu gom rác:
      • Đã điều chỉnh cho SMP
      • Hỗ trợ kích thước vùng nhớ khối xếp lớn hơn
      • Xử lý hợp nhất cho bitmap và vùng đệm byte
  • Thư viện cốt lõi Dalvik
    • Triển khai NIO mới, nhanh hơn nhiều (thư viện I/O hiện đại)
    • Cải thiện thông báo ngoại lệ
    • Sửa lỗi về độ chính xác và hiệu suất xuyên suốt

Báo cáo về sự khác biệt về API

Để biết thông tin chi tiết về tất cả các thay đổi đối với API trong Android 3.0 (API cấp 11), hãy xem Báo cáo điểm khác biệt về API.

Cấp độ API:

Nền tảng Android 3.0 cung cấp phiên bản cập nhật của API khung. API Android 3.0 được gán một giá trị nhận dạng số nguyên — 11 — được lưu trữ trong chính hệ thống. Giá trị nhận dạng này được gọi là "Cấp độ API" cho phép hệ thống xác định chính xác liệu ứng dụng có tương thích với hệ thống hay không trước khi cài đặt ứng dụng.

Để sử dụng các API được giới thiệu trong Android 3.0 trong ứng dụng, bạn cần biên dịch ứng dụng dựa trên thư viện Android được cung cấp trong nền tảng SDK Android 3.0. Tuỳ thuộc vào nhu cầu của mình, bạn cũng có thể thêm thuộc tính android:minSdkVersion="11" vào phần tử <uses-sdk> trong tệp kê khai của ứng dụng. Nếu ứng dụng của bạn được thiết kế để chỉ chạy trên Android 2.3 trở lên, việc khai báo thuộc tính này sẽ ngăn cài đặt ứng dụng trên các phiên bản trước đó của nền tảng.

Để biết thêm thông tin, hãy đọc bài viết Cấp độ API là gì?