Glance 通过 Action
类简化了用户交互处理。Glance 的 Action
类定义了用户可以执行的操作,并且您可以指定响应操作执行的操作。您可以使用 GlanceModifier.clickable
方法将 Action
应用于任何组件。
应用程序小部件位于远程进程中,因此操作是在创建时定义的,执行发生在远程进程中。在原生 RemoteViews
中,这是通过 PendingIntents
完成的。
本页描述了以下操作
启动活动
要在用户交互时启动活动,请将 actionStartActivity
函数提供给 Button
或其他可组合项,通过 GlanceModifier.clickable
(..) 修饰符。
在 actionStartActivity
中提供以下内容之一
- 目标活动类
- 该
ComponentName
- 一个意图
Glance 将 Action 转换为使用提供的目标和参数的 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() } )
或者,将其传递给支持它的可组合项上的 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() } } }
在内部,参数包含在用于启动活动的意图中,允许目标 Activity 检索它。
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 // ... } }