Jetpack架构组件学习——使用Glance实现桌面小组件

[复制链接]
发表于 2025-11-4 20:09:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
根本使用


1.添加依靠


添加Glance依靠:

  1. // For AppWidgets support
  2.    implementation "androidx.glance:glance-appwidget:1.1.0"
  3.    // For interop APIs with Material 3
  4.    implementation "androidx.glance:glance-material3:1.1.0"
  5.    // For interop APIs with Material 2
  6.    implementation "androidx.glance:glance-material:1.1.0"
复制代码

2.正常的相干设置


xml文件夹添加小组件widget_info.xml设置:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:tools="http://schemas.android.com/tools"
  4.     android:targetCellWidth="2"
  5.     android:targetCellHeight="2"
  6.     android:minWidth="250dp"
  7.     android:minHeight="250dp"
  8.     android:updatePeriodMillis="0"
  9.     android:initialLayout="@layout/glance_default_loading_layout"
  10.     tools:targetApi="s">
  11. </appwidget-provider>
复制代码

清单文件设置:

  1. <receiver android:name=".appwidgets.MyAppWidgetReceiver"
  2.         android:exported="true">
  3.         <intent-filter>
  4.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  5.         </intent-filter>
  6.         <meta-data
  7.                 android:name="android.appwidget.provider"
  8.                 android:resource="@xml/widget_info" />
  9. </receiver>
复制代码

3.创建widget对象和实现界面


必要留意的几点:

1、界面的Row,Column,Text等,留意要使用Glance的包下的,否则会无法正常表现界面

   官方也是阐明白,Row,Box,Column现实末了创建的对象对应的Linearlayout和Framelayout
  
2、点击跳转的对应actionStartActivity方法,现实是返回一个Action对象 通过GlanceModifier.clickable(actionStartActivity(MainActivity::class.java))举行对应跳转

除了activity外,还能启动Service,BoardCast,详见此文档处置惩罚用户互动 | Jetpack Compose | Android Developers

3、关于配景圆角的方法,现在接纳Box内里套一个Image和具体内容实现,Image去加载我们drawable里的矢量图对象(shape的那种)来实现

4、remember在内里可用,但如果联合animateColorAsState这种动画结果,现实上并没有用果(只是单纯的变更,没有中心过渡过程)

  1. class MyAppWidgetReceiver : GlanceAppWidgetReceiver() {
  2.     //MyAppWidget里就是类似我们remoteview的创建
  3.     override val glanceAppWidget: GlanceAppWidget = MyAppWidget()
  4. }
  5. class MyAppWidget : GlanceAppWidget() {
  6.     override suspend fun provideGlance(context: Context, id: GlanceId) {
  7.         // In this method, load data needed to render the AppWidget.
  8.         // Use `withContext` to switch to another thread for long running
  9.         // operations.
  10.         provideContent {
  11.             val upSpeed by DataRespotiy.upSpeed.asFlow().collectAsState(initial = 0L)
  12.             val downloadSpeed by DataRespotiy.downloadSpeed.asFlow().collectAsState(initial = 0L)
  13.             Box(GlanceModifier.fillMaxSize()) {
  14.                 Image(provider = ImageProvider(R.drawable.app_widget_bg), contentDescription = null, modifier = GlanceModifier.fillMaxSize())
  15.                 Column(GlanceModifier.fillMaxSize()) {
  16.                     Spacer(GlanceModifier.height(28.dp))
  17.                     Row(GlanceModifier.fillMaxWidth().padding(horizontal = 20.dp)) {
  18.                         androidx.glance.Image(provider = ImageProvider(R.mipmap.logo), contentDescription = null, modifier = GlanceModifier.size(108.dp))
  19.                         Spacer(modifier = GlanceModifier.width(24.dp))
  20.                         Column(GlanceModifier.defaultWeight()) {
  21.                             Row(modifier = GlanceModifier.wrapContentHeight(), horizontalAlignment = Alignment.End, verticalAlignment = Alignment.Vertical.CenterVertically) {
  22.                                 Text(text = "${upSpeed} Kb/s", style = TextStyle(color = ColorProvider(APP_Primary_color), fontSize = 22.sp))
  23.                                 Spacer(modifier = GlanceModifier.width(4.dp))
  24.                                 androidx.glance.Image(provider = ImageProvider(R.drawable.icon_upload_widget), contentDescription = null, modifier = GlanceModifier.size(32.dp))
  25.                             }
  26.                             Spacer(modifier = GlanceModifier.height(18.dp))
  27.                             Row(modifier = GlanceModifier, horizontalAlignment = Alignment.End, verticalAlignment = Alignment.Vertical.CenterVertically) {
  28.                                 Text(text = "${downloadSpeed} Kb/s", style = TextStyle(color = ColorProvider(APP_Bigfile_color), fontSize = 22.sp))
  29.                                 Spacer(modifier = GlanceModifier.width(4.dp))
  30.                                 androidx.glance.Image(provider = ImageProvider(R.drawable.icon_down_widget), contentDescription = null, modifier = GlanceModifier.size(32.dp))
  31.                             }
  32.                         }
  33.                     }
  34.                     Spacer(GlanceModifier.height(28.dp))
  35.                     Box(modifier = GlanceModifier.fillMaxWidth().defaultWeight()) {
  36.                         Image(provider = ImageProvider(R.drawable.app_widget_bg1), contentDescription = null, modifier = GlanceModifier.fillMaxSize())
  37.                         Row(
  38.                             modifier = GlanceModifier.fillMaxSize()
  39.                                 .padding(horizontal = 20.dp,16.dp), horizontalAlignment = Alignment.CenterHorizontally
  40.                         ) {
  41.                             val modifier = GlanceModifier.defaultWeight()
  42.                             //todo 不同的item类型
  43.                             repeat(3) { index ->
  44.                                 Row(modifier, horizontalAlignment = Alignment.CenterHorizontally, verticalAlignment = Alignment.Vertical.CenterVertically) {
  45.                                     androidx.glance.Image(
  46.                                         provider = ImageProvider(R.drawable.icon_net_test), contentDescription = null, modifier = GlanceModifier
  47.                                             .size(108.dp)
  48.                                             .clickable(actionStartActivity(MainActivity::class.java))
  49.                                     )
  50.                                 }
  51.                                 Spacer(GlanceModifier.width(20.dp))
  52.                             }
  53.                         }
  54.                     }
  55.                 }
  56.             }
  57.         }
  58.     }
  59. }
复制代码

其他增补


更新小组件方法:

  1. val manager = GlanceAppWidgetManager(application)
  2. val widget = MyAppWidget()
  3. val glanceIds = manager.getGlanceIds(widget.javaClass)
  4. glanceIds.forEach { glanceId ->
  5.         widget.update(application, glanceId)
  6. }
  7. //第二种方式(实际上和上面的方法是一样的,下面这个是官方给我们封装的另外个方法)
  8. MyAppWidget().updateAll(application)
复制代码

   文章转载自:Stars-one
  原文链接:Jetpack架构组件学习(6)——使用Glance实现桌面小组件 - Stars-one - 博客园
  体验地点:引迈 - JNPF快速开辟平台_低代码开辟平台_零代码开辟平台_流程计划器_表单引擎_工作流引擎_软件架构
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表