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à ứng dụng nhà phát triển. Tài liệu này giới thiệu những thông tin đáng chú ý nhất và các API mới hữu ích dành cho nhà phát triển.

Là nhà phát triển ứng dụng, bạn nên tải xuống hình ảnh hệ thống và nền tảng SDK Android 4.2 từ Trình quản lý SDK sớm nhất có thể. Nếu bạn không có thiết bị chạy Android 4.2 để kiểm thử ứng dụng của bạn, hãy sử dụng hệ thống Android 4.2 hình ảnh để kiểm thử ứng dụng của bạn trên trình mô phỏng Android. Sau đó, xây dựng ứng dụng của bạn 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 tốt 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 hình ảnh hệ thống Android 4.2, kiểm thử ứng dụng đó, sau đó phát hành bản cập nhật có thay đổi này.

Bạn có thể sử dụng các API trong Android 4.2 trong khi vẫn hỗ trợ các phiên bản cũ hơn 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 các API không được minSdkVersion hỗ trợ. Để tìm hiểu thêm về việc duy trì khả năng tương thích ngược, hãy đọc bài viết Tạo giao diện người dùng có khả nă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 API là gì Cấp độ?

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 ý những thay đổi sau đây có thể ảnh hưởng đến hành vi của ứng dụng:

  • Trình cung cấp nội dung không còn được xuất theo mặc định. Tức 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 nhà cung cấp nội dung của bạn, thì giờ đây, bạn phải đặt rõ ràng android:exported="true".

    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ị 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 thông tin vị trí chính xác), hệ thống sẽ không cung cấp thông tin ước tính vị trí của người dùng chính xác hơn 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 đối với chế độ cài đặt được xác định trong Settings.System đã chuyển sang Settings.Global, thì thao tác ghi sẽ không thành công khi chạy trên Android 4.2 trở lên.

    Ngay cả khi giá trị của bạn 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 dùng WebView, Android 4.2 sẽ thêm một lớp bổ sung bảo mật để bạn có thể liên kết JavaScript với Mã Android. Nếu bạn đặt targetSdkVersion lên 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 có sẵn cho JavaScript của bạn (phương thức này cũng phải được công khai). Nếu bạn không cung cấp chú thích, 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 từ 16 trở xuống thì không bắt buộc phải thêm chú thích, nhưng 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.

    Đọc thêm về liên kết Mã JavaScript sang 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. Quảng cáo 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 nguồn vào bộ sạc (thay vì tắt màn hình). Daydream hiển thị mỗi lần một giấc mơ, mà có thể là một màn hình hoàn toàn trực quan, thụ động, loại bỏ khi chạm hoặc có thể tương tác và phản hồi cho toàn bộ 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, để chúng linh hoạt hơn và mạnh mẽ hơn hình nền động hoặc tiện ích ứng dụng.

Bạn có thể tạo một giấc mơ cho Daydream bằng cách triển khai một lớp con của DreamService. Các API DreamService là được thiết kế tương tự như Activity. Để chỉ định giao diện người dùng cho giấc mơ, hãy truyền mã nhận dạng tài nguyên bố cục hoặc View đến 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 lệnh gọi lại quan trọng khác trong vòng đời bên trên 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 – hệ thống sẽ tự động khởi chạy DreamService.

Nếu giấc mơ của bạn có tính tương tác, bạn có thể bắt đầu một hoạt động từ giấc mơ để đưa người dùng vào toàn bộ giao diện người dùng của ứng dụng để biết thêm thông tin 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.

Để hệ thống truy cập được vào chế độ 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 bằng thao tác "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>

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

  • setInteractive(boolean) kiểm soát việc Giấc mơ nhận được các sự kiện đầu vào hoặc thoát ngay khi người dùng nhập. Nếu giấc mơ là thì người dùng có thể sử dụng nút Quay lại hoặc nút Màn hình chính để thoát khỏi chế độ ngủ hoặc bạn có thể gọi finish() để chấm dứt giấc mơ.
  • Nếu muốn một màn hình sống động hoàn toàn, bạn có thể gọi setFullscreen() để ẩn thanh trạng thái.
  • Trước khi Chế độ ngủ bắt đầu, màn hình sẽ giảm độ sáng để báo cho người dùng biết rằng hết thời gian chờ ở chế độ không hoạt động sắp tới. 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ụ

Giờ đây, Android cho phép ứng dụng của bạn hiển thị nội dung riêng biệ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 riêng biệ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(). Bên trong onCreate(), 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ể hiển thị một giao diện người dùng riêng biệ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ù các 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 lúc, bạn thường nên sử dụng MediaRouter để nhanh chóng truy cập vào màn hình mặc định của hệ thống bản trình bày.

Để lấy màn hình mặc định cho bản trình bày, hãy gọi MediaRouter.getSelectedRoute() và truyền 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 đã chọn của hệ thống cho bản trình bày video. Nếu MediaRouter.RouteInfo không phải là giá trị rỗng, hãy gọi getPresentationDisplay() để lấy Display đại diện cho 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 vào 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 thời điểm màn hình mới được kết nối trong thời gian chạy, hãy tạo một thực thể của MediaRouter.SimpleCallback để 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 có một mới màn hình bản trình bày đã được kết nối. Sau đó, hãy đăng ký MediaRouter.SimpleCallback bằng cách truyền MediaRouter.SimpleCallback vào MediaRouter.addCallback() cùng với loại tuyến ROUTE_TYPE_LIVE_VIDEO. Khi bạn 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á thêm 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.

Lưu ý rằng những 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ó thể có mật độ màn hình khác. Vì các đặc điểm màn hình có thể khác nhau, nên bạn nên cung cấp các tài nguyên được tối ưu hoá riêng cho các màn hình lớn hơn như vậy. Nếu bạn cần yêu cầu tài nguyên bổ sung 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 các 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 Presentation tài liệu của lớp.

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

Android hiện cho phép người dùng thêm 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 vào Màn hình chính. Nếu bạn muốn tiện ích ứng dụng cũng có 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 ở màn hình khoá bằng thuộc tính android:initialKeyguardLayout. API này hoạt động giống như android:initialLayout, ở chỗ 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 của bạn.

Để 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ả cách định kích thước tiện ích ứng dụng khi ở 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ó tập hợp tài khoản, ứng dụng, chế độ cài đặt hệ thống, tệp riêng và bất kỳ nội dung nào khác dữ liệu liên quan đến người dùng.

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

Để đảm bảo ứ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 khảo thư mục ứng dụng nội bộ hoặc vị trí bộ nhớ ngoài bằng đường dẫn được mã hoá cứng và thay vào đó 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ể, bạn sẽ không thể truy cập vào dữ liệu đó khi chạy dưới vai trò của 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 tài khoản khác mối liên kết, 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 khởi động lần đầu, bạn chắc chắn sẽ nhận đượ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ã thông báo cục bộ được tìm nạp từ máy chủ của mình hoặc sử dụng mã nhận dạng đăng ký do Google Cloud Messaging cung cấp.

Hãy lưu ý rằng nếu ứng dụng của bạn 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 WiFi hoặc số SERIAL), thì các giá trị này 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 liên kết với phần cứng chứ không phải người dùng. Chưa kể đến các vấn đề khác mà các giá trị nhận dạng này gây ra như đã thảo luận trong bài đăng trên blog Xác định lượt cài đặt ứng dụng.

Chế độ cài đặt chung mới

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

Một số chế độ cài đặt hiện tại đã được chuyển từ Settings.System hoặc Settings.Secure sang đây. Nếu ứng dụng của bạn là hiện đang thực hiện các thay đổi đối với chế độ cài đặt đã xác định trước đó trong Settings.System (chẳng hạn như AIRPLANE_MODE_ON), thì bạn sẽ nhận được làm như vậy sẽ không hoạt động trên thiết bị chạy Android 4.2 trở lên nếu các cài đặt đó là đã chuyển đến 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 này không còn được coi là an toàn để ứng dụng thay đổi, nên việc cố gắng thay đổi sẽ không thành công và hệ thống sẽ ghi một 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 tạo giao diện người dùng chuyển đổi hướng bố cục một cách linh hoạt để hỗ trợ các ngôn ngữ sử dụng giao diện người dùng và hướng đọc từ phải sang trái (RTL), 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à đặt “true". Sau khi bạn bật, hệ thống sẽ bật nhiều API RTL để hiển thị ứng dụng của bạn theo bố cục RTL. Ví dụ: thanh tác vụ 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, cũng như bất kỳ bố cục nào bạn đã tạo bằng các lớp View do khung cung cấp cũng sẽ được đảo ngược.

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

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

    Ví dụ: sử dụng android:layout_marginStart thay vì android:layout_marginLeftandroid:layout_marginEnd thay vì 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ế 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 để cung cấp khả năng tối ưu hoá hoàn chỉnh cho bố cục RTL, bạn có thể cung cấp các thành phần hoàn toàn riêng biệt tệp bố cục bằng bộ hạn định tài nguyên ldrtl (ldrtl là viết tắt của cụm từ layout-direction từ phải sang trái}). 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á cho RTL trong res/layout-ldrtl/.

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

Có nhiều API khác trên khung này để 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 phù hợp cho các khung hiển thị và trong Configuration để truy vấn hướng bố cục hiện tại.

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

Mảnh lồng nhau

Giờ đây, bạn có thể nhúng mảnh bên trong mảnh. Điều này hữu ích trong 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 vốn đã động và có thể sử dụng lại. Ví dụ: nếu bạn sử dụng ViewPager để tạo các mảnh vuốt sang trái và phải đồng thời chiếm phần lớn không gian màn hình, bạn có thể hãy chèn mảnh vào từng trang mảnh.

Để lồng một mảnh, bạn chỉ cần gọi getChildFragmentManager() bật Fragment mà bạn muốn thêm 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ừ trong 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ừ bên trong một mảnh lồng nhau, bạn có thể 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 mảnh lồng nhau thiết kế mảnh 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 đó chứa <fragment>. Các mảnh lồng nhau chỉ được hỗ trợ khi được thêm vào một mảnh một cách linh động.

RenderScript

Chức năng tính toán RenderScript đã được cải thiện với 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 tích hợp của tập lệnh Renderscript giúp triển khai các thao tác phổ biến cho bạn như:

Để sử dụng hàm nội tại của tập lệnh, hãy gọi phương thức create() tĩnh cho mỗi hàm nội tại để tạo một phiên bản của tập lệnh. Sau đó, bạn gọi các phương thức set() có sẵn của mỗi tập lệnh nội tại để đặt mọi tuỳ chọn và dữ liệu đầu vào cần thiết. 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 Renderscript liên quan với nhau và thực thi các tập lệnh đó 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 bạn thêm tất cả tập lệnh, hãy tạo kết nối giữa các tập lệnh bằng cách gọi addConnection(). Khi bạn đã thêm xong các 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 dữ liệu đầ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 dữ liệu đầu ra Allocation, nơi kết quả sẽ được ghi vào và tập lệnh cuối cùng vào 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 đối với các API Renderscript hiện có, cho phép mã thu được chạy trên nhiều bộ xử lý hơn (CPU, GPU và DSP). Để tạo tệp Filterscript, hãy tạo .fs thay vì .rs tệp và chỉ định #pragma rs_fp_relaxed thành cho thời gian chạy Renderscript biết các tập lệnh của bạn không yêu cầu độ chính xác dấu phẩy động IEEE 754-2008 nghiêm ngặt. Độ chính xác này cho phép flush-to-zero đối với denorm và round-towards-zero. Ngoài ra, Filterscript các tập lệnh không được sử dụng loại tích hợp 32 bit và phải chỉ định hàm gốc tùy chỉnh bằng cách sử dụng hàm __attribute__((kernel)) vì Filterscript không hỗ trợ con trỏ chữ ký mặc định của hàm root() xác định.

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

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