Android- Widget (应用微件/小组件/插件) 使用介绍

这篇具有很好参考价值的文章主要介绍了Android- Widget (应用微件/小组件/插件) 使用介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概念:

App Widget 即叫 应用微件 或者 小组件/插件.
是可以嵌入其他应用(如主屏幕)并 接收定期更新微型应用视图
这些视图称为界面中的微件.
例如,添加到桌面上的音乐Widget:

Android- Widget (应用微件/小组件/插件) 使用介绍

app_widget_music_sample.PNG

能够容纳其他应用微件的应用组件称为 AppWidgetHost (应用微件托管应用)
App 通过传递要显示布局id 给RemoteViews, 即可以获取Widget的实例对象.

官网介绍:
指南:https://developer.android.com/guide/topics/appwidgets
UI指南(更详细): https://developer.android.com/develop/ui/views/appwidgets/overview

二、基础知识

官网上的介绍顺序有点难懂,可以参考一下顺序,方便理解.

要创建App Widget,大体需要以下三点:

(1) 视图布局
定义 Widget的布局 (xml)

注意:
这个布局需要添加到 RemoteViews, 而 RemoteViews 是不支持 ConstraintLayout的.
支持:LinearLayout/FrameLayout/RelativeLayout/GridLayout, 以及TextView/Button等基础控件(不支持他们的子类)

(2) AppWidgetProviderInfo 对象
将数据封装在元素里
描述App Widget的元数据(meta-data),如布局、更新频率和 AppWidgetProvider 类。
此对象应在 XML 中定义 并且 要在 AndroidManifest.xml中声明

(3) AppWidgetProvider 类实现
定义了 基于广播事件, 通知到 Widget 的方法。
会在更新、启用、停用和删除 Widget 时收到广播。
要在 AndroidManifest.xml中声明
App可以通过它操作RemoteViews,例如更新等

三、使用流程

1. 创建Widget 内容的 布局

/layout/widget_content.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/forward_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="这是一个测试的Widget内容 点击我快速使用 App 某个功能" />

</RelativeLayout>

2. 添加 AppWidgetProviderInfo 元数据

数据封装在元素里.
/xml/example_appwidget_info.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialKeyguardLayout="@layout/widget_content"
    android:initialLayout="@layout/widget_content"
    android:minHeight="110dp"
    android:minWidth="180dp"
    android:previewImage="@drawable/example_appwidget_preview"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="0"
    android:widgetCategory="home_screen">

</appwidget-provider>

其中,
(1) initialLayout 则表示 widget 显示的内容
(2) minWidth / minHeight 表示Widget默认情况下,占用的最小空间. (最小大小不得超过 4 x 4 单元格)
(3) previewImage 表示预览图片,即用户添加时展示的 (这里是example_appwidget_preview.png )
(4) resizeMode 指定可以按什么规则来调整大小 (“horizontal”、“vertical”和“none”)
(5) widgetCategory 是否可以显示在主屏幕(home_screen) 和/或锁定屏幕 (keyguard)
注:这个XML 文件将会在AndroidManifest 声明 AppWidgetProvider组件时,由meta-data引用

3. 使用 AppWidgetProvider 类

AppWidgetProvider 类扩展了 BroadcastReceiver, 作为一个辅助类来处理应用微件广播。
仅接收与Widget有关的事件广播,例如当更新、删除、启用和停用Widget时发出的广播.

当发生这些广播事件时,AppWidgetProvider 会接收以下方法调用:
onUpdate()
onAppWidgetOptionsChanged()
onDeleted(Context, int[])
onEnabled(Context)
onDisabled(Context)
onReceive(Context, Intent)

最重要的是 onUpdate, 如果要处理任何用户交互事件,都需要在此回调处理.
这里我们设置,点击了Widget 后,跳转到 ExampleActivity 里.

class ExampleAppWidgetProvider : AppWidgetProvider() {

    override fun onUpdate(
        context: Context,
        appWidgetManager: AppWidgetManager,
        appWidgetIds: IntArray
    ) {
        // Perform this loop procedure for each App Widget that belongs to this provider
        appWidgetIds.forEach { appWidgetId ->
            // Create an Intent to launch ExampleActivity
            val pendingIntent: PendingIntent = Intent(context, ExampleActivity::class.java)
                .let { intent ->
                    PendingIntent.getActivity(context, 0, intent,
                        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) // set flags to fix fatal when sdk >=31
                }

            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            val views: RemoteViews = RemoteViews(
                context.packageName,
                R.layout.widget_content
            ).apply {
                setOnClickPendingIntent(R.id.forward_button, pendingIntent)
            }

            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views)
        }
    }
}
    

其中,
(1) appWidgetIds 是一个ID 数组,对应每一添加到主屏幕的Widget实例.
(即:可以在主屏幕添加 多个Widget)
(2) 不同的Widget 实例,updatePeriodMillis 更新周期表依照第一个Widget实例.
(3) pendingIntent 用于点击Widget上的Button时,跳转到ExampleActivity
注意:在SDK>=31 上,需要设置 FLAG_IMMUTABLE. 否则会出现fatal error:Strongly consider using FLAG_IMMUTABLE…
(4) ExampleActivity 是一个简单的Activity,
代码:

class ExampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_example)
    }
}

activity_example 为布局资源,仅显示一个TextView

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ExampleActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show this From Widget!!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

4. 在AndroidManifest中声明 AppWidgetProvider 并声明 AppWidgetProviderInfo

        <receiver android:name="ExampleAppWidgetProvider"
            android:exported="true">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/example_appwidget_info" />
        </receiver>

需要在清单中声明后,才能在小组件设置里添加.

此处的声明可以反推出来:
(1) App Widget的入口,其实依赖 里声明的action:android.appwidget.action.APPWIDGET_UPDATE
(2)猜测系统(Launcher) 将会遍历所有的AndroidManifest, 然后找到有这个action所在的组件.
在用户长按应用图标时,可显示应用 自定义的组件。
(3)而这个自定义组件的内容是 从 meta-data里的 “android.appwidget.provider” 读取出来。
(4)后续,有小组件的事件,则是通知到它所声明的receiver (这里是ExampleAppWidgetProvider)

至此,已经完成所有,
运行app即可体验.

5. 效果图如下:

(1)添加Widget

Android- Widget (应用微件/小组件/插件) 使用介绍

demo_add widget.PNG

(2) 添加Widget时的 预览图

Android- Widget (应用微件/小组件/插件) 使用介绍

add widget preview.PNG

(3) Widget 显示图

Android- Widget (应用微件/小组件/插件) 使用介绍

widget_in home screen.PNG

(4) 点击Widget的button 后则会跳转的对应的Activity文章来源地址https://www.toymoban.com/news/detail-403360.html

到了这里,关于Android- Widget (应用微件/小组件/插件) 使用介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp - 超详细实现播放 svg / svga 格式动画组件插件,用于直播间赠送礼物特效动画或项目动画特效较多的应用(新手小白保姆级教程,提供插件+详细运行示例+使用文档+注意事项+格式说明)

    网上关于 uniapp 播放 svg / svga 格式动画的教程很乱,基本上全是 BUG 和各种不兼容,很难复制过来自己用。 本文实现了 在 uniapp 项目中(完美兼容 H5 / App / 微信小程序平台),播放 svg / svga 格式动画功能的详细介绍, 您只需要使用我提供的 “组件源码及插件”,放到项目中去

    2023年04月24日
    浏览(190)
  • iOS14 Widget 小组件调研

    桌面小组件是iOS14推出的一种新的桌面内容展现形式。 根据苹果的统计数据,“一般用户每天进入主屏幕的次数超过90次”,如果有一个我们应用的小组件在桌面,每天都有超过90次曝光在用户眼前的机会,这绝对是一个顶级的流量入口。 “但停留的总时长不过几分钟”,通

    2024年01月25日
    浏览(37)
  • flutter开发实战-父子Widget组件调用方法

    flutter开发实战-父子Widget组件调用方法 在最近开发中遇到了需要父组件调用子组件方法,子组件调用父组件的方法。这里记录一下方案。 父组件使用globalKey.currentState调用子组件具体方法,子组件通过方法回调callback方法调用父组件的方法。 例如示例中的 例如父组件 父组件使

    2024年02月15日
    浏览(41)
  • Flutter Widget Life Cycle 组件生命周期

    了解 widget 生命周期,对我们开发组件还是很重要的。 今天会把无状态、有状态组件的几个生命周期函数一起过下。 原文 https://ducafecat.com/blog/flutter-widget-life-cycle https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html 无状态组件

    2024年02月15日
    浏览(40)
  • Android widget基础指南

    widget的概念最早是由一名叫Rose的苹果工程师提出,后来经过多方面机缘巧合的发展下,便有了今天Android平台上的小组件widget,一般APP开发可能应用场景较少,最常见的莫过于天气APP的widget。但对于从事IOT或车载方向的同学,定制化Launcher涉及修改的widget的相关业务则可能不少

    2024年02月20日
    浏览(38)
  • 智能小程序小部件(Widget)导航、地图、画布等组件,以及开放能力、原生组件说明

    智能小程序小部件(Widget)导航、地图、画布等组件,以及开放能力、原生组件说明。 页面链接,控制小程序的跳转。navigator 子节点的背景色应为透明色。 属性说明 属性名 类型 默认值 必填 说明 url string 是 跳转地址 delta number 1 否 当 open-type 为 \\\'navigateBack\\\' 时有效,表示回退的

    2024年01月17日
    浏览(47)
  • 一篇读懂 Android 开发中模块化、组件化、插件化和热修复

    网上关于 “Android 开发\\\" 的文章很多,我本人学习 Android 开发的过程也借鉴了网上先辈们的文章;但大多数文章都从底层的细枝末节开始讲述,由下而上给人一种这门技术“博大精深”望而生畏的感觉;而我写这篇文章的初衷就是由上而下,希望别人在阅读的过程中能够觉得

    2023年04月08日
    浏览(40)
  • 智能小程序小部件(Widget)表单组件属性说明+代码明细

    在 Tuya MiniApp Tools 中,新建项目并选择小部件(Widget)对应模板即可自动创建小部件(Widget)项目。 按钮,用于强调操作并引导用户去点击。 属性说明 属性名 类型 默认值 必填 说明 size string default 否 按钮的大小 type string default 否 按钮的样式类型 plain boolean false 否 是否镂空 disa

    2024年01月17日
    浏览(44)
  • 智能小程序小部件(Widget)媒体组件属性说明和示例代码汇总

    基础库 2.2.0 开始支持, 低版本需做兼容处理。 系统相机。相关 API:ty.createCameraContext。这是基于异层渲染的原生组件, 请注意原生组件使用限制。 属性说明 属性名 类型 默认值 必填 说明 mode string normal 否 应用模式,只在初始化时有效,不能动态变更 resolution string medium 否 分

    2024年01月17日
    浏览(36)
  • Android车载Launcher开发(1) - 显示Widget

    Launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面。作为车机开机后用户接触到的第一个带有界面的系统级APP,和普通APP一样,它的界面也是在Activity上绘制出来的。

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包