Glance 通过 Action 类简化了处理用户互动的流程。Glance
Action 类定义用户可以执行的操作,并且您可以指定
操作。您可以将 Action 应用于
组件替换为 GlanceModifier.clickable 方法。
应用 widget 位于远程进程中,因此操作在创建时定义
并且执行发生在远程进程中。在原生 RemoteViews 中,
可通过 PendingIntents 完成。
此页面介绍了以下操作:
。启动 activity
如需在用户互动时启动 activity,请提供
actionStartActivity 函数传递给 Button 或其他可组合项(通过
GlanceModifier.clickable(..) 修饰符。
在 actionStartActivity 中提供以下任一项:
- 目标 activity 类
ComponentName- Intent
Glance 会根据提供的目标将 Action 转换为 PendingIntent,
参数。在以下示例中,当发生以下情况时,系统会启动 NavigationActivity:
用户点击该按钮:
@Composable fun MyContent() { // .. Button( text = "Go Home", onClick = actionStartActivity<MyActivity>() ) }
启动服务
与启动 activity 类似,使用 activity 在用户交互时启动服务
所有 actionStartService 方法。
在 actionStartService 中提供以下任一项:
- 目标 activity 类
ComponentName- intent
@Composable fun MyButton() { // .. Button( text = "Sync", onClick = actionStartService<SyncService>( isForegroundService = true // define how the service is launched ) ) }
发送广播事件
使用
actionSendBroadcast 方法:
在 actionSendBroadcast 中提供以下任一项:
- 字符串操作
ComponentName- intent
BroadcastReceiver类
@Composable fun MyButton() { // .. Button( text = "Send", onClick = actionSendBroadcast<MyReceiver>() ) }
执行自定义操作
Glance 无需启动特定目标,而是使用 lambda 操作或
actionRunCallback:用于执行更新界面或状态等操作
用户互动
运行 lambda 操作
您可以将 lambda 函数用作界面交互的回调。
例如,将 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 } }
用户点击时,提供的 suspend onAction 方法
调用 ActionCallback,同时执行定义的逻辑(即请求
刷新数据)。
如需在执行操作后更新 widget,请创建新实例并
调用 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,以便目标 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 // ... } }