API Android 4.2

Cấp độ API: 17

Android 4.2 (JELLY_BEAN_MR1) là bản cập nhật cho bản phát hành Jelly Bean, 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ú ý và hữu ích nhất cho nhà phát triển.

Là nhà phát triển ứng dụng, bạn nên tải hình ảnh hệ thống và nền tảng SDK Android 4.2 xuống từ Trình quản lý SDK càng sớm càng tốt. Nếu bạn không có thiết bị chạy Android 4.2 để kiểm thử ứng dụng, hãy sử dụng ảnh hệ thống Android 4.2 để kiểm thử ứng dụng trên trình mô phỏng Android. Sau đó, xây dựng ứng dụng dựa trên nền tảng Android 4.2 để bắt đầu sử dụng các API mới nhất.

Để 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 4.2, bạn nên đặt targetSdkVersion thành "17", cài đặt ứng dụng trên ảnh hệ thống Android 4.2, kiểm thử rồi phát hành bản cập nhật với thay đổi này.

Bạn có thể sử dụng API trong Android 4.2 đồng thời vẫn hỗ trợ các phiên bản cũ hơn 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ề việc duy trì khả năng tương thích ngược, vui lòng đọc bài viết Tạo giao diện người dùng tương thích ngược.

Bạn có thể xem thêm thông tin về cách hoạt động của các cấp độ API trong 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 một ứng dụng dành cho Android, hãy lưu ý những thay đổi sau đây có thể ảnh hưởng đến hành vi của ứng dụng:

  • Theo mặc định, trình cung cấp nội dung không còn được xuất nữa. Điều đó có nghĩa là giá trị mặc định của thuộc tính android:exported hiện là “false". Nếu quan trọng là các ứng dụng khác có thể truy cập vào trình cung cấp nội dung của bạn, thì giờ đây, bạn phải đặt android:exported="true" một cách rõ ràng.

    Thay đổi này chỉ có hiệu lực nếu bạn đặt android:targetSdkVersion hoặc android:minSdkVersion thành 17 trở lên. Nếu không, giá trị mặc định vẫn là “true" ngay cả khi chạy trên Android 4.2 trở lên.

  • So với các phiên bản Android trước, kết quả về vị trí của người dùng có thể kém chính xác hơn nếu ứng dụng của bạn yêu cầu quyền ACCESS_COARSE_LOCATION nhưng không yêu cầu quyền ACCESS_FINE_LOCATION.

    Để đáp ứng kỳ vọng về quyền riêng tư của người dùng khi ứng dụng của bạn yêu cầu quyền truy cập thông tin vị trí tương đối (chứ không phải vị trí chính xác), hệ thống sẽ không cung cấp thông tin ước tính vị trí chính xác hơn của một khu phố.

  • Một số chế độ cài đặt thiết bị do Settings.System xác định hiện ở chế độ chỉ có thể đọc. Nếu ứng dụng của bạn cố gắng ghi các thay đổi vào chế độ cài đặt được xác định trong Settings.System và đã chuyển sang Settings.Global, thì thao tác ghi sẽ tự động không thành công khi chạy trên Android 4.2 trở lên.

    Ngay cả khi giá trị cho android:targetSdkVersionandroid:minSdkVersion thấp hơn 17, ứng dụng của bạn vẫn không thể sửa đổi các chế độ cài đặt đã chuyển sang Settings.Global khi chạy trên Android 4.2 trở lên.

  • Nếu ứng dụng của bạn sử dụng WebView, thì Android 4.2 sẽ thêm một lớp bảo mật bổ sung để bạn có thể liên kết JavaScript với mã Android một cách an toàn hơn. Nếu đặt targetSdkVersion từ 17 trở lên, bạn hiện phải thêm chú thích @JavascriptInterface vào bất kỳ phương thức nào mà bạn muốn cung cấp cho JavaScript của mình (phương thức này cũng phải ở chế độ công khai). Nếu bạn không cung cấp chú giải, thì trang web trong WebView sẽ không truy cập được phương thức này khi chạy trên Android 4.2 trở lên. Nếu bạn đặt targetSdkVersion thành 16 trở xuống, thì bạn không bắt buộc phải sử dụng chú thích. Tuy nhiên, bạn nên cập nhật phiên bản đích và thêm chú thích để tăng cường bảo mật.

    Hãy đọc thêm về liên kết mã JavaScript với mã Android.

Daydream

Daydream là chế độ trình bảo vệ màn hình tương tác mới dành cho thiết bị Android. Tính năng này tự động kích hoạt khi thiết bị được cắm vào đế hoặc khi thiết bị ở trạng thái rảnh trong khi cắm vào bộ sạc (thay vì tắt màn hình). Daydream hiển thị một giấc mơ tại một thời điểm, có thể là một màn hình hoàn toàn trực quan, thụ động đóng khi chạm hoặc có thể tương tác và phản hồi với đầy đủ các sự kiện đầu vào. Giấc mơ của bạn chạy trong quy trình của ứng dụng và có toàn quyền truy cập vào bộ công cụ giao diện người dùng Android, bao gồm thành phần hiển thị, bố cục và ảnh động. Do đó, chúng linh hoạt và mạnh mẽ hơn so với hình nền động hoặc tiện ích ứng dụng.

Bạn có thể triển khai một lớp con của DreamService để tạo giấc mơ cho Daydream. Các API DreamService được thiết kế tương tự như các API của Activity. Để chỉ định giao diện người dùng cho giấc mơ của bạn, hãy truyền mã tài nguyên bố cục hoặc View cho setContentView() bất cứ lúc nào sau khi bạn có một cửa sổ, chẳng hạn như từ lệnh gọi lại onAttachedToWindow().

Lớp DreamService cung cấp các phương thức gọi lại quan trọng khác trong vòng đời ở đầu các API Service cơ sở, chẳng hạn như onDreamingStarted(), onDreamingStopped()onDetachedFromWindow(). Bạn không thể bắt đầu DreamService từ ứng dụng của mình. Ứng dụng này do hệ thống tự động chạy.

Nếu giấc mơ của bạn có tính tương tác, thì bạn có thể bắt đầu một hoạt động từ giấc mơ để đưa người dùng vào giao diện người dùng đầy đủ của ứng dụng nhằm biết thêm chi tiết hoặc quyền kiểm soát. Bạn có thể sử dụng finish() để kết thúc giấc mơ để người dùng có thể thấy Hoạt động mới.

Để hiện chế độ ngủ của bạn cho hệ thống, hãy khai báo DreamService bằng phần tử <service> trong tệp kê khai. Sau đó, bạn phải thêm một bộ lọc ý định cùng với hành động "android.service.dreams.DreamService". Ví dụ:

<service android:name=".MyDream" android:exported="true"
    android:icon="@drawable/dream_icon" android:label="@string/dream_label" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

Có một số phương thức hữu ích khác trong DreamService mà bạn cần lưu ý:

  • setInteractive(boolean) kiểm soát việc giấc mơ nhận được các sự kiện đầu vào hay thoát ngay khi người dùng nhập. Nếu giấc mơ có tính tương tác, người dùng có thể sử dụng các nút Back (Quay lại) hoặc Home (Màn hình chính) để thoát khỏi giấc mơ hoặc bạn có thể gọi finish() để dừng giấc mơ đó.
  • Nếu muốn có một màn hình sống động, bạn có thể gọi setFullscreen() để ẩn thanh trạng thái.
  • Trước khi Daydream khởi động, màn hình sẽ giảm độ sáng để báo cho người dùng biết rằng sắp hết thời gian chờ ở trạng thái rảnh. Thay vào đó, khi gọi setScreenBright(true), bạn có thể đặt màn hình ở độ sáng thông thường.

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

Màn hình phụ

Android hiện cho phép ứng dụng của bạn hiển thị nội dung duy nhất trên các màn hình bổ sung được kết nối với thiết bị của người dùng qua kết nối có dây hoặc Wi-Fi. Để tạo nội dung duy nhất cho màn hình phụ, hãy mở rộng lớp Presentation và triển khai lệnh gọi lại onCreate(). Trong onCreate(), hãy chỉ định giao diện người dùng cho màn hình phụ bằng cách gọi setContentView(). Là một phần mở rộng của lớp Dialog, lớp Presentation cung cấp khu vực mà ứng dụng của bạn có thể cho thấy một giao diện người dùng duy nhất trên màn hình phụ.

Để phát hiện màn hình phụ mà bạn có thể hiển thị Presentation, hãy sử dụng API DisplayManager hoặc MediaRouter. Mặc dù API DisplayManager cho phép bạn liệt kê nhiều màn hình có thể được kết nối cùng một lúc, nhưng thông thường, bạn nên dùng MediaRouter để nhanh chóng truy cập vào màn hình mặc định của hệ thống cho các bản trình bày.

Để có màn hình mặc định cho bản trình bày, hãy gọi MediaRouter.getSelectedRoute() và truyền tham số đó ROUTE_TYPE_LIVE_VIDEO. Thao tác này sẽ trả về một đối tượng MediaRouter.RouteInfo mô tả tuyến đường hiện được chọn của hệ thống cho bản trình bày video. Nếu MediaRouter.RouteInfo không rỗng, hãy gọi getPresentationDisplay() để lấy Display biểu thị màn hình đã kết nối.

Sau đó, bạn có thể hiển thị bản trình bày bằng cách truyền đối tượng Display đến hàm khởi tạo cho lớp Presentation. Bản trình bày của bạn bây giờ sẽ xuất hiện trên màn hình phụ.

Để phát hiện trong thời gian chạy khi một màn hình mới được kết nối, hãy tạo một thực thể của MediaRouter.SimpleCallback, trong đó bạn triển khai phương thức gọi lại onRoutePresentationDisplayChanged(). Hệ thống sẽ gọi phương thức này khi một màn hình trình bày mới được kết nối. Sau đó, đăng ký MediaRouter.SimpleCallback bằng cách truyền vào MediaRouter.addCallback() cùng với loại tuyến ROUTE_TYPE_LIVE_VIDEO. Khi nhận được lệnh gọi đến onRoutePresentationDisplayChanged(), bạn chỉ cần gọi MediaRouter.getSelectedRoute() như đã đề cập ở trên.

Để tối ưu hoá giao diện người dùng trong Presentation cho màn hình phụ, bạn có thể áp dụng một giao diện khác bằng cách chỉ định thuộc tính android:presentationTheme trong <style> mà bạn đã áp dụng cho ứng dụng hoặc hoạt động của mình.

Xin lưu ý rằng các màn hình được kết nối với thiết bị của người dùng thường có kích thước màn hình lớn hơn và có khả năng sẽ có mật độ màn hình khác. Vì đặc điểm màn hình có thể khác nhau, bạn nên cung cấp tài nguyên được tối ưu hoá riêng cho những màn hình lớn hơn như vậy. Nếu bạn cần yêu cầu thêm tài nguyên từ Presentation, hãy gọi getContext().getResources() để lấy đối tượng Resources tương ứng với màn hình. Điều này cung cấp những tài nguyên thích hợp từ ứng dụng của bạn, phù hợp nhất với kích thước và mật độ màn hình của màn hình phụ.

Để biết thêm thông tin và một số mã mẫu, hãy xem tài liệu về lớp Presentation.

Tiện ích trên màn hình khoá

Android hiện cho phép người dùng thêm các tiện ích ứng dụng vào màn hình khoá. Để có thể sử dụng Tiện ích ứng dụng trên màn hình khoá, hãy thêm thuộc tính android:widgetCategory vào tệp XML chỉ định AppWidgetProviderInfo. Thuộc tính này hỗ trợ hai giá trị: home_screenkeyguard. Theo mặc định, thuộc tính này được đặt thành home_screen để người dùng có thể thêm tiện ích ứng dụng của bạn vào Màn hình chính. Nếu bạn muốn tiện ích ứng dụng cũng có sẵn trên màn hình khoá, hãy thêm giá trị keyguard:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:widgetCategory="keyguard|home_screen">
</appwidget-provider>

Bạn cũng nên chỉ định bố cục ban đầu cho tiện ích ứng dụng khi ở trên màn hình khoá bằng thuộc tính android:initialKeyguardLayout. Tính năng này hoạt động giống như android:initialLayout, vì nó cung cấp bố cục có thể xuất hiện ngay lập tức cho đến khi tiện ích ứng dụng của bạn được khởi chạy và có thể cập nhật bố cục.

Để biết thêm thông tin về cách tạo tiện ích ứng dụng cho màn hình khoá, bao gồm cả việc xác định kích thước phù hợp cho tiện ích ứng dụng khi ở trên màn hình khoá, hãy xem hướng dẫn về Tiện ích ứng dụng.

Nhiều người dùng

Android hiện cho phép nhiều không gian người dùng trên các thiết bị có thể chia sẻ như máy tính bảng. Mỗi người dùng trên một thiết bị có một nhóm tài khoản, ứng dụng, chế độ cài đặt hệ thống, tệp riêng và mọi dữ liệu khác liên quan đến người dùng.

Là nhà phát triển ứng dụng, bạn không cần phải làm gì khác để ứng dụng của bạn hoạt động phù hợp với nhiều người dùng trên một thiết bị. Bất kể thiết bị có bao nhiêu người dùng, dữ liệu mà ứng dụng lưu cho một người dùng nhất định sẽ được tách biệt với dữ liệu mà ứng dụng lưu cho những người dùng khác. Hệ thống theo dõi xem dữ liệu nào thuộc về quy trình người dùng mà ứng dụng của bạn đang chạy, đồng thời chỉ cung cấp cho ứng dụng quyền truy cập vào dữ liệu của người dùng đó và không cấp quyền truy cập vào dữ liệu của người dùng khác.

Lưu dữ liệu trong môi trường nhiều người dùng

Bất cứ khi nào ứng dụng của bạn lưu các lựa chọn ưu tiên của người dùng, tạo cơ sở dữ liệu hoặc ghi tệp vào bộ nhớ trong hoặc bộ nhớ ngoài của người dùng, dữ liệu đó chỉ truy cập được khi chạy với tư cách người dùng đó.

Để chắc chắn ứng dụng của bạn hoạt động đúng cách trong môi trường nhiều người dùng, đừng tham chiếu đến thư mục ứng dụng nội bộ hoặc vị trí bộ nhớ ngoài của bạn bằng đường dẫn được mã hoá cứng và thay vào đó hãy luôn sử dụng các API thích hợp:

Bất kể bạn sử dụng API nào trong số này để lưu dữ liệu cho một người dùng cụ thể, dữ liệu vẫn sẽ không truy cập được khi chạy với tư cách một người dùng khác. Từ quan điểm của ứng dụng, mỗi người dùng đang chạy trên một thiết bị hoàn toàn riêng biệt.

Xác định người dùng trong môi trường nhiều người dùng

Nếu ứng dụng của bạn muốn xác định người dùng riêng biệt, chẳng hạn như để thu thập số liệu phân tích hoặc tạo các mối liên kết tài khoản khác, bạn nên làm theo các phương pháp được đề xuất để xác định số lượt cài đặt riêng biệt. Bằng cách tạo một UUID mới khi ứng dụng của bạn khởi động lần đầu tiên, bạn chắc chắn sẽ có được một mã nhận dạng duy nhất để theo dõi từng người dùng, bất kể có bao nhiêu người dùng cài đặt ứng dụng của bạn trên một thiết bị. Ngoài ra, bạn có thể lưu một mã thông báo cục bộ được tìm nạp từ máy chủ hoặc sử dụng mã nhận dạng lượt đăng ký do Google Cloud Messaging cung cấp.

Hãy lưu ý rằng nếu ứng dụng yêu cầu một trong các giá trị nhận dạng thiết bị phần cứng (chẳng hạn như địa chỉ MAC của Wi-Fi hoặc số SERIAL), thì các giá trị đó sẽ cung cấp cùng một giá trị cho mỗi người dùng vì các giá trị nhận dạng này được liên kết với phần cứng chứ không phải người dùng. Chưa đề cập đến các vấn đề khác mà các giá trị nhận dạng này giới thiệu như đã thảo luận trong bài đăng trên blog Xác định bản cài đặt ứng dụng.

Cài đặt chung mới

Các chế độ cài đặt hệ thống đã được cập nhật để hỗ trợ nhiều người dùng bằng việc thêm Settings.Global. Tập hợp các chế độ cài đặt này tương tự như chế độ cài đặt Settings.Secure vì chúng ở chế độ chỉ có thể đọc, nhưng được áp dụng chung cho mọi không gian người dùng trên thiết bị.

Một số chế độ cài đặt hiện có đã được chuyển đến đây từ Settings.System hoặc Settings.Secure. Nếu ứng dụng của bạn hiện đang thực hiện các thay đổi đối với các chế độ cài đặt đã xác định trước đó trong Settings.System (chẳng hạn như AIRPLANE_MODE_ON), thì bạn nên dự kiến rằng thao tác đó sẽ không còn hoạt động trên thiết bị chạy Android 4.2 trở lên nếu các chế độ cài đặt đó đã được chuyển sang Settings.Global. Bạn có thể tiếp tục đọc các chế độ cài đặt trong Settings.Global, nhưng vì các chế độ cài đặt đó không còn được coi là an toàn để ứng dụng thay đổi, nên việc cố gắng làm như vậy sẽ tự động không thành công và hệ thống sẽ ghi cảnh báo vào nhật ký hệ thống khi chạy ứng dụng trên Android 4.2 trở lên.

Hỗ trợ bố cục RTL

Android hiện cung cấp một số API cho phép bạn xây dựng giao diện người dùng có khả năng chuyển đổi linh hoạt hướng bố cục để hỗ trợ các ngôn ngữ sử dụng giao diện người dùng từ phải sang trái (RTL) và hướng đọc, chẳng hạn như tiếng Ả Rập và tiếng Do Thái.

Để bắt đầu hỗ trợ bố cục RTL trong ứng dụng, hãy đặt thuộc tính android:supportsRtl thành phần tử <application> trong tệp kê khai và thiết lập thuộc tính đó “true". Sau khi bạn bật tính năng này, hệ thống sẽ bật nhiều API RTL để hiển thị ứng dụng của bạn với các bố cục RTL. Ví dụ: thanh thao tác sẽ hiển thị biểu tượng và tiêu đề ở bên phải và các nút hành động ở bên trái, đồng thời mọi bố cục mà bạn đã tạo bằng các lớp View do khung cung cấp cũng sẽ bị đảo ngược.

Nếu cần tối ưu hoá hơn nữa giao diện của ứng dụng khi hiển thị bằng bố cục RTL, có 2 cấp độ tối ưu hoá cơ bản:

  1. Chuyển đổi thuộc tính bố cục hướng trái và phải thành thuộc tính bố cục hướng bắt đầu và hướng kết thúc.

    Ví dụ: sử dụng android:layout_marginStart thay cho android:layout_marginLeftandroid:layout_marginEnd thay cho android:layout_marginRight.

    Lớp RelativeLayout cũng cung cấp các thuộc tính bố cục tương ứng để thay thế các vị trí trái/phải, chẳng hạn như android:layout_alignParentStart để thay thế android:layout_alignParentLeftandroid:layout_toStartOf thay vì android:layout_toLeftOf.

  2. Hoặc để tối ưu hoá hoàn toàn cho bố cục RTL, bạn có thể cung cấp các tệp bố cục hoàn toàn riêng biệt bằng cách sử dụng bộ hạn định tài nguyên ldrtl (ldrtl là viết tắt của layout-direction-right-to-left}). Ví dụ: bạn có thể lưu các tệp bố cục mặc định trong res/layout/ và các bố cục được tối ưu hoá RTL trong res/layout-ldrtl/.

    Bộ hạn định ldrtl là lựa chọn phù hợp cho các tài nguyên có thể vẽ, nhờ đó, bạn có thể cung cấp đồ hoạ được định hướng theo hướng tương ứng với hướng đọc.

Nhiều API khác có sẵn trên khung để hỗ trợ bố cục RTL, chẳng hạn như trong lớp View để bạn có thể triển khai các hành vi thích hợp cho khung hiển thị tuỳ chỉnh và trong Configuration để truy vấn hướng bố cục hiện tại.

Lưu ý: Nếu bạn đang dùng SQlite và có bảng hoặc tên cột là "chỉ có số", hãy cẩn thận: việc sử dụng String.format(String, Object...) có thể gây ra lỗi khi các số đã được chuyển đổi sang tiếng Ả Rập tương đương nếu thiết bị của bạn đã được đặt sang ngôn ngữ tiếng Ả Rập. Bạn phải dùng String.format(Locale,String,Object...) để đảm bảo các số được giữ nguyên theo bộ mã ASCII. Ngoài ra, hãy sử dụng String.format("%d", int) thay vì sử dụng String.valueOf(int) để định dạng số.

Các mảnh lồng nhau

Giờ đây, bạn có thể nhúng các mảnh bên trong mảnh. Điều này hữu ích cho nhiều trường hợp mà bạn muốn đặt các thành phần giao diện người dùng động và có thể sử dụng lại vào một thành phần giao diện người dùng linh động và có thể sử dụng lại. Ví dụ: nếu sử dụng ViewPager để tạo các mảnh vuốt sang trái và phải và chiếm phần lớn không gian màn hình, thì giờ đây, bạn có thể chèn các mảnh vào từng trang mảnh.

Để lồng một mảnh, chỉ cần gọi getChildFragmentManager() trên Fragment mà bạn muốn thêm một mảnh. Thao tác này sẽ trả về một FragmentManager mà bạn có thể sử dụng như bình thường từ hoạt động cấp cao nhất để tạo giao dịch mảnh. Ví dụ: dưới đây là một số mã thêm một mảnh từ bên trong một lớp Fragment hiện có:

Kotlin

val videoFragment = VideoPlayerFragment()
childFragmentManager.beginTransaction().apply {
    add(R.id.video_fragment, videoFragment)
    commit()
}

Java

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

Từ trong một mảnh lồng nhau, bạn có thể lấy thông tin tham chiếu đến mảnh mẹ bằng cách gọi getParentFragment().

Thư viện hỗ trợ Android hiện cũng hỗ trợ các mảnh lồng nhau, vì vậy, bạn có thể triển khai các thiết kế mảnh lồng nhau trên Android 1.6 trở lên.

Lưu ý: Bạn không thể tăng cường bố cục thành một mảnh khi bố cục đó có chứa <fragment>. Các mảnh lồng ghép chỉ được hỗ trợ khi được thêm vào một mảnh theo phương thức động.

RenderScript

Chúng tôi đã cải tiến chức năng tính toán Renderscript bằng các tính năng sau:

Hàm nội tại của tập lệnh

Bạn có thể sử dụng các hàm nội tại trong tập lệnh tích hợp của Renderscript để triển khai các thao tác phổ biến cho mình, chẳng hạn như:

Để sử dụng một hàm nội tại của tập lệnh, hãy gọi phương thức create() tĩnh của mỗi hàm để tạo một thực thể của tập lệnh. Sau đó, bạn có thể gọi các phương thức set() có sẵn của từng hàm nội tại của tập lệnh để đặt bất kỳ dữ liệu đầu vào và tuỳ chọn cần thiết nào. Cuối cùng, hãy gọi phương thức forEach() để thực thi tập lệnh.

Nhóm tập lệnh

ScriptGroup cho phép bạn liên kết các tập lệnh Renderscript có liên quan và thực thi chúng bằng một lệnh gọi.

Sử dụng ScriptGroup.Builder để thêm tất cả tập lệnh vào nhóm bằng cách gọi addKernel(). Sau khi thêm tất cả tập lệnh, hãy tạo sự kết nối giữa các tập lệnh bằng cách gọi addConnection(). Sau khi thêm xong kết nối, hãy gọi create() để tạo nhóm tập lệnh. Trước khi thực thi nhóm tập lệnh, hãy chỉ định đầu vào Allocation và tập lệnh ban đầu để chạy bằng phương thức setInput(Script.KernelID, Allocation) và cung cấp đầu ra Allocation nơi kết quả sẽ được ghi vào và tập lệnh cuối cùng để chạy bằng setOutput(). Cuối cùng, hãy gọi execute() để chạy nhóm tập lệnh.

Tập lệnh bộ lọc

Filterscript xác định các quy tắc ràng buộc trên các API Renderscript hiện có cho phép mã kết quả chạy trên nhiều bộ xử lý hơn (CPU, GPU và DSP). Để tạo tệp Filterscript, hãy tạo tệp .fs thay vì tệp .rs và chỉ định #pragma rs_fp_relaxed để cho thời gian chạy Renderscript biết rằng tập lệnh của bạn không yêu cầu độ chính xác nghiêm ngặt của dấu phẩy động IEEE 754-2008. Độ chính xác này cho phép flush-to-zero đối với denorm và round-towards-zero. Ngoài ra, tập lệnh Filterscript không được sử dụng các loại tích hợp 32 bit và phải chỉ định hàm gốc tuỳ chỉnh bằng cách sử dụng thuộc tính __attribute__((kernel)), vì tập lệnh Filterscript không hỗ trợ con trỏ. Đây là chữ ký mặc định của hàm root() xác định.

Lưu ý: Mặc dù nền tảng này hỗ trợ Filterscript, nhưng nhà phát triển sẽ có trong Bản phát hành Bộ công cụ SDK 21.0.1.

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