Glance 使用 Action 類別,簡化處理使用者互動的方式。Glance 的 Action 類別定義了使用者可執行的動作,您可以指定要執行的作業來回應動作。您可以使用 GlanceModifier.clickable 方法,將 Action 套用至任何元件。
應用程式小工具位於遠端程序,因此動作會在建立時定義,並在遠端程序中執行。在原生 RemoteViews 中,這項操作是使用 PendingIntents 完成。
本頁面說明下列動作:
啟動活動
如要在使用者互動時啟動活動,請使用 GlanceModifier.clickable 修飾符,將 actionStartActivity 函式提供給 Button 或其他可組合函式。
在 actionStartActivity 中提供下列其中一項:
- 目標活動類別
ComponentName- 意圖
Glance 會使用提供的目標和參數,將動作轉譯為 PendingIntent。在以下範例中,當使用者點選按鈕時,系統會啟動 NavigationActivity:
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
推出服務
與啟動活動類似,請使用其中一個 actionStartService 方法,在使用者互動時啟動服務。
在 actionStartService 中提供下列其中一項:
- 目標活動類別
ComponentName- 意圖
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
傳送廣播事件
使用下列其中一種 actionSendBroadcast 方法,在使用者互動時傳送廣播事件:
在 actionSendBroadcast 中提供下列其中一項:
- 字串動作
ComponentName- 意圖
BroadcastReceiver類別
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
執行自訂動作
Glance 不會啟動特定目標,而是使用 lambda 動作或 actionRunCallback 執行動作,例如在使用者互動時更新 UI 或狀態。
執行 lambda 動作
您可以使用 lambda 函式做為 UI 互動的回呼。
例如,將 lambda 函式傳遞至 GlanceModifier.clickable 修飾符:
Text( text = "Submit", modifier = GlanceModifier.clickable { submitData() } )
或者,您也可以將地圖 ID 傳遞至支援該 ID 的可組合函式 onClick 參數:
Button( text = "Submit", onClick = { submitData() } )
執行 ActionCallback
或者,您也可以使用 actionRunCallback 方法,在使用者互動時執行動作。如要這樣做,請提供 ActionCallback 的自訂實作:
@Composable private fun MyContent() { // .. Image( provider = ImageProvider(R.drawable.ic_hourglass_animated), modifier = GlanceModifier.clickable( onClick = actionRunCallback<RefreshAction>() ), contentDescription = "Refresh" ) } class RefreshAction : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { // TODO implement } }
使用者點選時,系統會呼叫所提供 ActionCallback 的 suspend onAction 方法,執行定義的邏輯 (即要求重新整理資料)。
如要在執行動作後更新小工具,請建立新例項並呼叫 update(..)。詳情請參閱「管理 GlanceAppWidget 狀態」一節。
class RefreshAction : ActionCallback { override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { // do some work but offset long-term tasks (e.g a Worker) MyAppWidget().update(context, glanceId) } }
為動作提供參數
如要為動作提供額外資訊,請使用 ActionParameters API 建立有類型的鍵/值組合。舉例來說,如要定義點擊的目的地:
private val destinationKey = ActionParameters.Key<String>( NavigationActivity.KEY_DESTINATION ) class MyAppWidget : GlanceAppWidget() { // .. @Composable private fun MyContent() { // .. Button( text = "Home", onClick = actionStartActivity<NavigationActivity>( actionParametersOf(destinationKey to "home") ) ) Button( text = "Work", onClick = actionStartActivity<NavigationActivity>( actionParametersOf(destinationKey to "work") ) ) } override suspend fun provideGlance(context: Context, id: GlanceId) { provideContent { MyContent() } } }
在底層,參數會包含在用於啟動活動的意圖中,讓目標活動擷取。
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val destination = intent.extras?.getString(KEY_DESTINATION) ?: return // ... } }
參數也會提供給 ActionCallback。使用定義的 Parameters.Key 擷取值:
class RefreshAction : ActionCallback { private val destinationKey = ActionParameters.Key<String>( NavigationActivity.KEY_DESTINATION ) override suspend fun onAction( context: Context, glanceId: GlanceId, parameters: ActionParameters ) { val destination: String = parameters[destinationKey] ?: return // ... } }