Trình đơn Cài đặt nhanh là các ô hiển thị trong bảng Cài đặt nhanh, đại diện cho các thao tác mà người dùng có thể nhấn vào để nhanh chóng hoàn tất các thao tác định kỳ.
Ứng dụng của bạn có thể cung cấp một thẻ thông tin tuỳ chỉnh cho người dùng thông qua lớp TileService
và sử dụng đối tượng Tile
để theo dõi trạng thái của thẻ thông tin đó. Ví dụ: bạn có thể tạo một thẻ thông tin cho phép người dùng bật hoặc tắt VPN do ứng dụng của bạn cung cấp.
Quyết định thời điểm tạo thẻ thông tin
Bạn nên tạo thẻ thông tin cho những chức năng cụ thể mà bạn mong muốn người dùng truy cập thường xuyên hoặc cần truy cập nhanh (hoặc cả hai). Thẻ thông tin hiệu quả nhất là những thẻ phù hợp với cả hai đặc điểm này, cho phép truy cập nhanh vào các thao tác thường được thực hiện.
Ví dụ: bạn có thể tạo thẻ thông tin cho một ứng dụng thể dục để người dùng có thể nhanh chóng bắt đầu một phiên tập thể dục. Tuy nhiên, bạn không nên tạo thẻ thông tin cho cùng một ứng dụng vì việc này sẽ cho phép người dùng xem lại toàn bộ nhật ký tập thể dục của mình.
Để giúp cải thiện khả năng được phát hiện và dễ sử dụng của thẻ thông tin, bạn nên tránh một số phương pháp:
Tránh dùng thẻ thông tin để chạy ứng dụng. Thay vào đó, hãy dùng lối tắt ứng dụng hoặc trình chạy chuẩn.
Tránh sử dụng thẻ thông tin cho thao tác người dùng một lần. Thay vào đó, hãy sử dụng lối tắt ứng dụng hoặc thông báo.
Tránh tạo quá nhiều thẻ thông tin. Bạn nên sử dụng tối đa 2 lối tắt ứng dụng cho mỗi ứng dụng.
Tránh sử dụng thẻ thông tin cho thấy thông tin nhưng không tương tác được với người dùng. Thay vào đó, hãy sử dụng một thông báo hoặc tiện ích.
Tạo thẻ thông tin
Để tạo một thẻ thông tin, trước tiên, bạn cần tạo một biểu tượng thẻ thông tin phù hợp, sau đó tạo và khai báo TileService
trong tệp kê khai của ứng dụng.
Mẫu Cài đặt nhanh cung cấp một ví dụ về cách tạo và quản lý thẻ thông tin.
Tạo biểu tượng tuỳ chỉnh
Bạn cần cung cấp một biểu tượng tuỳ chỉnh. Biểu tượng này sẽ hiển thị trên thẻ thông tin trong bảng điều khiển Quick Settings (Cài đặt nhanh). (Bạn sẽ thêm biểu tượng này khi khai báo TileService
, như được mô tả trong phần tiếp theo.) Biểu tượng phải có màu trắng đồng nhất với nền trong suốt, có kích thước 24 x 24 dp và có dạng VectorDrawable
.
Tạo một biểu tượng gợi ý trực quan về mục đích của thẻ thông tin. Điều này giúp người dùng dễ dàng xác định xem thẻ thông tin của bạn có phù hợp với nhu cầu của họ hay không. Ví dụ: bạn có thể tạo biểu tượng đồng hồ bấm giờ cho thẻ thông tin của một ứng dụng thể dục để cho phép người dùng bắt đầu một phiên tập thể dục.
Tạo và khai báo TileService
Tạo một dịch vụ cho thẻ thông tin, dịch vụ này sẽ mở rộng lớp TileService
.
Kotlin
class MyQSTileService: TileService() { // Called when the user adds your tile. override fun onTileAdded() { super.onTileAdded() } // Called when your app can update your tile. override fun onStartListening() { super.onStartListening() } // Called when your app can no longer update your tile. override fun onStopListening() { super.onStopListening() } // Called when the user taps on your tile in an active or inactive state. override fun onClick() { super.onClick() } // Called when the user removes your tile. override fun onTileRemoved() { super.onTileRemoved() } }
Java
public class MyQSTileService extends TileService { // Called when the user adds your tile. @Override public void onTileAdded() { super.onTileAdded(); } // Called when your app can update your tile. @Override public void onStartListening() { super.onStartListening(); } // Called when your app can no longer update your tile. @Override public void onStopListening() { super.onStopListening(); } // Called when the user taps on your tile in an active or inactive state. @Override public void onClick() { super.onClick(); } // Called when the user removes your tile. @Override public void onTileRemoved() { super.onTileRemoved(); } }
Khai báo TileService
trong tệp kê khai của ứng dụng. Thêm tên và nhãn của TileService
, biểu tượng tuỳ chỉnh mà bạn đã tạo trong phần trước và quyền thích hợp.
<service
android:name=".MyQSTileService"
android:exported="true"
android:label="@string/my_default_tile_label" // 18-character limit.
android:icon="@drawable/my_default_icon_label"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
Quản lý TileService
Sau khi tạo và khai báo TileService
trong tệp kê khai ứng dụng, bạn phải quản lý trạng thái của nó.
TileService
là một dịch vụ ràng buộc. TileService
của bạn bị ràng buộc khi được ứng dụng yêu cầu hoặc nếu hệ thống cần giao tiếp với ứng dụng đó. Vòng đời dịch vụ ràng buộc điển hình có bốn phương thức gọi lại sau: onCreate()
, onBind()
, onUnbind()
và onDestroy()
. Hệ thống gọi các phương thức này mỗi khi dịch vụ chuyển sang một giai đoạn trong vòng đời mới.
Tổng quan về vòng đời của TileService
Ngoài các lệnh gọi lại kiểm soát vòng đời dịch vụ ràng buộc, bạn phải triển khai các phương thức khác dành riêng cho vòng đời TileService
. Các phương thức này có thể được gọi bên ngoài onCreate()
và onDestroy()
vì các phương thức vòng đời Service
và phương thức vòng đời TileService
được gọi trong 2 luồng không đồng bộ riêng biệt.
Vòng đời TileService
chứa các phương thức sau. Các phương thức này được hệ thống gọi mỗi khi TileService
chuyển sang một giai đoạn vòng đời mới:
onTileAdded()
: Phương thức này chỉ được gọi khi người dùng thêm thẻ thông tin lần đầu tiên và nếu người dùng xoá rồi thêm lại thẻ thông tin của bạn. Đây là thời điểm tốt nhất để thực hiện mọi thao tác khởi chạy một lần. Tuy nhiên, điều này có thể không đáp ứng mọi yêu cầu khởi chạy cần thiết.onStartListening()
vàonStopListening()
: Các phương thức này được gọi mỗi khi ứng dụng cập nhật thẻ thông tin và thường xuyên được gọi.TileService
vẫn bị ràng buộc từonStartListening()
đếnonStopListening()
, cho phép ứng dụng của bạn sửa đổi thẻ thông tin và đẩy các bản cập nhật.onTileRemoved()
: Phương thức này chỉ được gọi nếu người dùng xoá thẻ thông tin của bạn.
Chọn chế độ nghe
TileService
của bạn nghe ở chế độ đang hoạt động hoặc chế độ không hoạt động. Bạn nên sử dụng chế độ đang hoạt động mà bạn cần khai báo trong tệp kê khai ứng dụng. Nếu không, TileService
là chế độ tiêu chuẩn và bạn không cần khai báo.
Đừng giả định rằng TileService
của bạn sẽ hoạt động bên ngoài cặp phương thức onStartListening()
và onStopListening()
.
Chế độ đang hoạt động (được đề xuất)
Sử dụng chế độ đang hoạt động cho TileService
để theo dõi và theo dõi trạng thái của chế độ này theo quy trình riêng. TileService
ở chế độ đang hoạt động được liên kết cho onTileAdded()
, onTileRemoved()
, các sự kiện nhấn và khi được quy trình ứng dụng yêu cầu.
Bạn nên sử dụng chế độ hoạt động nếu TileService
được thông báo khi trạng thái thẻ thông tin sẽ được cập nhật bằng quy trình riêng. Các thẻ thông tin đang hoạt động hạn chế tình trạng căng thẳng cho hệ thống vì chúng không phải liên kết mỗi khi bảng điều khiển Cài đặt nhanh hiển thị với người dùng.
Phương thức TileService.requestListeningState()
tĩnh có thể được gọi để yêu cầu bắt đầu trạng thái nghe và nhận lệnh gọi lại đến onStartListening()
.
Bạn có thể khai báo chế độ đang hoạt động bằng cách thêm META_DATA_ACTIVE_TILE
vào tệp kê khai của ứng dụng.
<service ...>
<meta-data android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="true" />
...
</service>
Chế độ không hoạt động
Chế độ không hoạt động là chế độ tiêu chuẩn. TileService
đang ở chế độ không hoạt động nếu nó bị liên kết bất cứ khi nào thẻ thông tin của bạn hiển thị với người dùng. Điều này có nghĩa là TileService
của bạn có thể được tạo và liên kết lại vào một số thời điểm nằm ngoài tầm kiểm soát. Thẻ thông tin cũng có thể không bị liên kết và huỷ khi người dùng không xem thẻ thông tin.
Ứng dụng sẽ nhận được lệnh gọi lại đến onStartListening()
sau khi người dùng mở bảng điều khiển Cài đặt nhanh. Bạn có thể cập nhật đối tượng Tile
bao nhiêu lần tuỳ thích trong khoảng từ onStartListening()
đến onStopListening()
.
Bạn không cần khai báo chế độ không hoạt động, chỉ cần thêm META_DATA_ACTIVE_TILE
vào tệp kê khai của ứng dụng.
Tổng quan về trạng thái thẻ thông tin
Sau khi người dùng thêm thẻ thông tin của bạn, thẻ thông tin đó luôn tồn tại ở một trong các trạng thái sau.
STATE_ACTIVE
: Cho biết trạng thái đang bật hoặc đã bật. Người dùng có thể tương tác với thẻ thông tin của bạn khi ở trạng thái này.Ví dụ: đối với một thẻ thông tin ứng dụng thể dục cho phép người dùng bắt đầu một phiên tập thể dục có tính giờ,
STATE_ACTIVE
có nghĩa là người dùng đã bắt đầu một phiên tập thể dục và bộ tính giờ đang chạy.STATE_INACTIVE
: Cho biết trạng thái tắt hoặc tạm dừng. Người dùng có thể tương tác với thẻ thông tin của bạn khi ở trạng thái này.Để sử dụng lại ví dụ về thẻ thông tin ứng dụng thể dục, một thẻ thông tin trong
STATE_INACTIVE
sẽ có nghĩa là người dùng chưa bắt đầu phiên tập thể dục, nhưng có thể làm như vậy nếu muốn.STATE_UNAVAILABLE
: Cho biết trạng thái tạm thời không hoạt động. Người dùng không thể tương tác với thẻ thông tin của bạn khi ở trạng thái này.Ví dụ: một thẻ thông tin trong
STATE_UNAVAILABLE
có nghĩa là thẻ thông tin này hiện không được cung cấp cho người dùng vì một lý do nào đó.
Hệ thống chỉ đặt trạng thái ban đầu của đối tượng Tile
. Bạn sẽ đặt trạng thái của đối tượng Tile
trong suốt thời gian còn lại của vòng đời.
Hệ thống có thể phủ màu biểu tượng và nền cho biểu tượng thẻ thông tin để phản ánh trạng thái của đối tượng Tile
. Các đối tượng Tile
được đặt thành STATE_ACTIVE
là tối nhất, trong khi STATE_INACTIVE
và STATE_UNAVAILABLE
ngày càng sáng hơn. Màu sắc chính xác là tuỳ thuộc vào nhà sản xuất và phiên bản.
Cập nhật thẻ thông tin
Bạn có thể cập nhật thẻ thông tin của mình sau khi nhận được lệnh gọi lại đến onStartListening()
.
Tuỳ thuộc vào chế độ của thẻ thông tin, bạn có thể cập nhật thẻ thông tin ít nhất một lần cho đến khi nhận được lệnh gọi lại đến onStopListening()
.
Ở chế độ đang hoạt động, bạn có thể cập nhật thẻ thông tin chính xác một lần trước khi nhận được lệnh gọi lại đến onStopListening()
. Ở chế độ không hoạt động, bạn có thể cập nhật thẻ thông tin bao nhiêu lần tuỳ thích trong khoảng thời gian từ onStartListening()
đến onStopListening()
.
Bạn có thể truy xuất đối tượng Tile
bằng cách gọi getQsTile()
. Để cập nhật các trường cụ thể của đối tượng Tile
, hãy gọi các phương thức sau:
Bạn phải gọi updateTile()
để cập nhật thẻ thông tin của mình sau khi hoàn tất việc đặt các trường của đối tượng Tile
thành các giá trị chính xác. Việc này sẽ giúp hệ thống phân tích cú pháp dữ liệu thẻ thông tin đã cập nhật và cập nhật giao diện người dùng.
Kotlin
data class StateModel(val enabled: Boolean, val label: String, val icon: Icon) override fun onStartListening() { super.onStartListening() val state = getStateFromService() qsTile.label = state.label qsTile.contentDescription = tile.label qsTile.state = if (state.enabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE qsTile.icon = state.icon qsTile.updateTile() }
Java
public class StateModel { final boolean enabled; final String label; final Icon icon; public StateModel(boolean e, String l, Icon i) { enabled = e; label = l; icon = i; } } @Override public void onStartListening() { super.onStartListening(); StateModel state = getStateFromService(); Tile tile = getQsTile(); tile.setLabel(state.label); tile.setContentDescription(state.label); tile.setState(state.enabled ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); tile.setIcon(state.icon); tile.updateTile(); }
Xử lý thao tác nhấn
Người dùng có thể nhấn vào thẻ thông tin của bạn để kích hoạt một thao tác nếu thẻ thông tin đó nằm trong STATE_ACTIVE
hoặc STATE_INACTIVE
. Sau đó, hệ thống sẽ gọi lệnh gọi lại onClick()
của ứng dụng.
Sau khi nhận được lệnh gọi lại đến onClick()
, ứng dụng của bạn có thể chạy một hộp thoại hoặc hoạt động, kích hoạt công việc trong nền hoặc thay đổi trạng thái của thẻ thông tin.
Kotlin
var clicks = 0 override fun onClick() { super.onClick() counter++ qsTile.state = if (counter % 2 == 0) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE qsTile.label = "Clicked $counter times" qsTile.contentDescription = qsTile.label qsTile.updateTile() }
Java
int clicks = 0; @Override public void onClick() { super.onClick(); counter++; Tile tile = getQsTile(); tile.setState((counter % 2 == 0) ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); tile.setLabel("Clicked " + counter + " times"); tile.setContentDescription(tile.getLabel()); tile.updateTile(); }
Khởi chạy hộp thoại
showDialog()
thu gọn bảng Cài đặt nhanh và hiển thị một hộp thoại.
Sử dụng hộp thoại để thêm ngữ cảnh vào hành động của bạn nếu hành động đó cần thông tin đầu vào bổ sung hoặc sự đồng ý của người dùng.
Chạy một hoạt động
startActivityAndCollapse()
bắt đầu một hoạt động trong khi thu gọn bảng điều khiển. Hoạt động sẽ hữu ích nếu cần hiển thị thông tin chi tiết hơn so với trong hộp thoại hoặc nếu hành động của bạn có tính tương tác cao.
Nếu ứng dụng của bạn yêu cầu tương tác đáng kể của người dùng, thì ứng dụng chỉ nên khởi chạy một hoạt động khi không còn cách nào khác. Thay vào đó, hãy cân nhắc sử dụng hộp thoại hoặc nút bật/tắt.
Khi người dùng nhấn và giữ một thẻ thông tin, người dùng sẽ nhìn thấy màn hình App Info (Thông tin ứng dụng). Để ghi đè hành vi này và thay vào đó chạy một hoạt động để đặt lựa chọn ưu tiên, hãy thêm <intent-filter>
vào một trong các hoạt động của bạn bằng ACTION_QS_TILE_PREFERENCES
.
Đánh dấu ô của bạn là có thể bật/tắt
Bạn nên đánh dấu thẻ thông tin của mình là có thể bật/tắt nếu thẻ này hoạt động chủ yếu dưới dạng nút chuyển hai trạng thái (đây là hành vi phổ biến nhất của thẻ thông tin). Điều này giúp cung cấp thông tin về hành vi của thẻ thông tin cho hệ điều hành và cải thiện khả năng hỗ trợ tiếp cận tổng thể.
Đặt siêu dữ liệu TOGGLEABLE_TILE
thành true
để đánh dấu thẻ thông tin của bạn là có thể bật/tắt.
<service ...>
<meta-data android:name="android.service.quicksettings.TOGGLEABLE_TILE"
android:value="true" />
</service>
Chỉ thực hiện các thao tác an toàn trên thiết bị được khoá bảo mật
Ô của bạn có thể xuất hiện ở đầu màn hình khoá trên các thiết bị đang khoá. Nếu thẻ thông tin chứa thông tin nhạy cảm, hãy kiểm tra giá trị của isSecure()
để xác định xem thiết bị có đang ở trạng thái bảo mật hay không và TileService
sẽ thay đổi hành vi cho phù hợp.
Nếu thao tác với thẻ thông tin có thể thực hiện an toàn khi bị khoá, hãy dùng startActivity()
để chạy một hoạt động ở đầu màn hình khoá.
Nếu thao tác với thẻ thông tin không an toàn, hãy sử dụng unlockAndRun()
để nhắc người dùng mở khoá thiết bị. Nếu thành công, hệ thống sẽ thực thi đối tượng Runnable
mà bạn truyền vào phương thức này.
Nhắc người dùng thêm ô của bạn
Để thêm thẻ thông tin của bạn theo cách thủ công, người dùng phải làm theo một số bước:
- Vuốt xuống để mở bảng điều khiển Cài đặt nhanh.
- Nhấn vào nút chỉnh sửa.
- Di chuyển qua tất cả các thẻ thông tin trên thiết bị cho đến khi tìm thấy thẻ thông tin của bạn.
- Nhấn và giữ rồi kéo ô đó đến danh sách các ô đang hoạt động.
Người dùng cũng có thể di chuyển hoặc xoá thẻ thông tin của bạn bất cứ lúc nào.
Kể từ Android 13, bạn có thể sử dụng phương thức requestAddTileService()
để giúp người dùng thêm thẻ thông tin của bạn vào thiết bị dễ dàng hơn. Phương thức này sẽ nhắc người dùng với một yêu cầu nhanh chóng thêm thẻ thông tin của bạn trực tiếp vào bảng điều khiển Cài đặt nhanh. Lời nhắc bao gồm tên ứng dụng, nhãn và biểu tượng được cung cấp.
public void requestAddTileService (
ComponentName tileServiceComponentName,
CharSequence tileLabel,
Icon icon,
Executor resultExecutor,
Consumer<Integer> resultCallback
)
Lệnh gọi lại chứa thông tin về việc thẻ thông tin đã được thêm hay chưa, đã được thêm hay chưa hoặc đã xảy ra lỗi nào.
Hãy cân nhắc khi quyết định thời điểm và tần suất nhắc người dùng. Bạn chỉ nên gọi requestAddTileService()
theo ngữ cảnh, chẳng hạn như khi người dùng tương tác lần đầu với một tính năng mà thẻ thông tin của bạn hỗ trợ.
Hệ thống có thể chọn ngừng xử lý yêu cầu cho một ComponentName
nhất định nếu người dùng đã từ chối yêu cầu đó đủ số lần trước đó. Người dùng được xác định từ Context
dùng để truy xuất dịch vụ này – dịch vụ này phải khớp với người dùng hiện tại.