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 đặtandroid: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ặcandroid: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ềnACCESS_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 trongSettings.System
và đã chuyển sangSettings.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:targetSdkVersion
vàandroid: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 sangSettings.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 đặttargetSdkVersion
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 trongWebView
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 đặttargetSdkVersion
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()
và 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ọifinish()
để 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_screen
và keyguard
. 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:
- Để truy cập vào bộ nhớ trong, hãy dùng
getFilesDir()
,getCacheDir()
hoặcopenFileOutput()
. - Để truy cập vào bộ nhớ ngoài, hãy dùng
getExternalFilesDir()
hoặcgetExternalStoragePublicDirectory()
.
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:
- 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 choandroid:layout_marginLeft
vàandroid:layout_marginEnd
thay choandroid: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_alignParentLeft
vàandroid:layout_toStartOf
thay vìandroid:layout_toLeftOf
. - 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 trongres/layout/
và các bố cục được tối ưu hoá RTL trongres/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ư:
Blends
Blur
Color matrix
3x3 convolve
5x5 convolve
Per-channel lookup table
Converting an Android YUV buffer to RGB
Để 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ứcset()
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ứcforEach()
để 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ọiaddKernel()
. 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ọiaddConnection()
. Sau khi thêm xong kết nối, hãy gọicreate()
để 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àoAllocation
và tập lệnh ban đầu để chạy bằng phương thứcsetInput(Script.KernelID, Allocation)
và cung cấp đầu raAllocation
nơi kết quả sẽ được ghi vào và tập lệnh cuối cùng để chạy bằngsetOutput()
. Cuối cùng, hãy gọiexecute()
để 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àmroot()
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.