android app widget_widget小组件[通俗易懂]

android app widget_widget小组件[通俗易懂]微件是自定义主屏幕的一个重要方面

应用微件是可以嵌入其他应用(如主屏幕)并接收定期更新的微型应用视图。这些视图称为界面中的微件,您可以使用应用微件提供程序发布微件。能够容纳其他应用微件的应用组件称为应用微件托管应用。
在这里插入图片描述

一、微件类型

  1. 信息微件
    信息微件通常会显示对用户来说很重要的一些关键信息元素,并跟踪该信息随时间变化的情况。天气微件、时钟微件或体育比分跟踪器等信息微件就是很好的例子。
  2. 集合微件
    集合微件专门显示同一类型的众多元素,如图库应用中的一系列图片、新闻应用中的一系列报道或通信应用中的一系列电子邮件/消息。
  3. 控制微件
    控制微件的主要用途是显示常用功能,用户可直接从主屏幕触发这些功能,而不必先打开应用。您可以将控制微件看作应用的遥控器。音乐应用微件就是一个典型的例子,这种控制微件允许用户在实际音乐应用之外播放、暂停或跳过音乐曲目。
  4. 混合微件
    虽然所有微件往往都属于上述三种类型之一,但实际上许多微件是将不同类型的元素组合在一起的混合微件。

二、基础知识

1. 微件基本组件

  • AppWidgetProviderInfo 对象
    描述应用微件的元数据,如应用微件的布局、更新频率和 AppWidgetProvider 类。此对象应在 XML 中定义。
  • AppWidgetProvider 类实现
    定义允许您基于广播事件以编程方式与应用微件连接的基本方法。通过它,您会在更新、启用、停用和删除应用微件时收到广播。
  • 微件视图布局
    定义应用微件的初始布局,在 XML 中定义。
  • 应用微件配置 Activity
    这是一个可选的 Activity,在用户添加您的应用微件时启动,并允许用户在应用微件创建时修改其设置。

2. AppWidgetProviderInfo 元数据

AppWidgetProviderInfo 使用 XML 定义应用微件的基本特性

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:configure="com.example.android.ExampleAppWidgetConfigure" android:initialLayout="@layout/example_appwidget" android:minWidth="40dp" android:minHeight="40dp" android:previewImage="@drawable/preview" android:resizeMode="horizontal|vertical" android:updatePeriodMillis="86400000" android:widgetCategory="home_screen" />    
属性 说明
minWidthminHeight 指定应用微件默认情况下占用的最小空间
minResizeWidthminResizeHeight 指定应用微件的绝对最小大小
updatePeriodMillis 定义小部件框架应AppWidgetProvider通过调用onUpdate()回调方法请求更新的频率
initialLayout 指向定义小部件布局的布局资源。
configure 定义要在用户添加应用微件时启动以便用户配置应用微件属性的 Activity
description 指定要为您的小部件显示的小部件选择器的描述。在 Android 12 中引入。
previewLayout(Android 12) 和previewImage(Android 11 及更低版本) 从 Android 12 开始,该previewLayout属性指定可缩放预览,您将其作为设置为小组件默认大小的 XML 布局提供。在 Android 11 或更低版本中,该previewImage属性指定小部件配置后的预览,用户在选择应用小部件时会看到该预览。如果未提供,用户将看到应用程序的启动器图标。
autoAdvanceViewId 指定应由小部件主机自动前进的小部件子视图的视图 ID。Android 3.0 中引入。
widgetCategory 声明您的小部件是否可以显示在主屏幕 (home_screen )、锁定屏幕 (keyguard ) 或两者上。仅5.0以下的Android版本支持锁屏小部件,对于Android 5.0及更高版本,仅home_screen有效
widgetFeatures 声明小部件支持的功能
resizeMode 指定可以按什么规则来调整微件的大小,resizeMode 属性的值包括horizontalverticalnone

3. AppWidgetProvider 类

AppWidgetProvider 类扩展了 BroadcastReceiver 作为一个辅助类来处理应用微件广播。AppWidgetProvider 仅接收与应用微件有关的事件广播,例如当更新、删除、启用和停用应用微件时发出的广播。当发生这些广播事件时,AppWidgetProvider 会接收以下方法调用:

  • onUpdate()
    当 widget 更新时被执行。当用户添加应用微件时也会调用此方法。

  • onAppWidgetOptionsChanged()
    当首次放置微件时以及每当调整微件的大小时,会调用此方法。

  • onDeleted(Context, int[])
    当 widget 被删除时被触发。

  • onEnabled(Context)
    当第1个 widget 的实例被创建时触发。也就是说,如果用户对同一个 widget 增加了两次(两个实例),那么onEnabled()只会在第一次增加widget时触发。

  • onDisabled(Context)
    当最后1个 widget 的实例被删除时触发。

  • onReceive(Context, Intent)
    接收到任意广播时触发,并且会在上述的方法之前被调用。

最重要的 AppWidgetProvider 回调是 onUpdate(),因为向托管应用添加每个应用微件时都会调用它(除非您使用配置 Activity)。如果应用微件接受任何用户交互事件,则您需要在此回调中注册事件处理脚本。如果应用微件未创建临时文件或数据库,或者未执行其他需要清理的工作,则 onUpdate() 可能是您需要定义的唯一一个回调方法。

AppWidgetProvider 只是一个辅助类。如果您希望直接接收应用微件广播,您可以实现自己的 BroadcastReceiver 或替换 onReceive(Context, Intent) 回调。

4. 创建应用微件布局

应用微件布局基于 RemoteViews,并不是每种布局或视图微件都受其支持。

RemoteViews 对象(因而应用微件)可以支持以下布局类:

FrameLayoutLinearLayoutRelativeLayoutGridLayout

以及以下微件类:

AnalogClockButtonChronometerImageButtonImageViewProgressBarTextViewViewFlipperListViewGridViewStackViewAdapterViewFlipper

并且不支持这些类的后代,即不支持自定义View。RemoteViews 还支持 ViewStub,它是一个大小为零的不可见视图,您可以使用它在运行时以懒散的方式扩充布局资源。

5. 微件的尺寸

虽然单元格的宽度和高度以及应用到微件的自动外边距量可能会因设备而异,但您可以使用下表根据所需占用的网格单元格数大致估算微件的最小尺寸:

单元格个数 (行 / 列) 对应的设置大小 (dp) (minWidth / minHeight)
1 40dp
2 110dp
3 180dp
4 250dp
n 70 × n − 30

最好保守估计 minWidth 和 minHeight,指定在良好默认状态下呈现微件的最小尺寸。

6. 在清单中声明应用微件

小部件需要在应用的 AndroidManifest.xml 文件中声明 AppWidgetProvider 类

<receiver android:name="ExampleAppWidgetProvider">
    <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>

<receiver> 元素需要 android:name 属性,该属性指定应用微件使用的 AppWidgetProvider。

<intent-filter> 元素必须包含一个具有 android:name 属性的 元素。此属性指定 AppWidgetProvider 接受 ACTION_APPWIDGET_UPDATE 广播。这是您必须明确声明的唯一一项广播。AppWidgetManager 会根据需要自动将其他所有应用微件广播发送到 AppWidgetProvider。

<meta-data> 元素指定 AppWidgetProviderInfo 资源,并且需要以下属性:

  • android:name – 指定元数据名称。使用 android.appwidget.provider 将数据标识为 AppWidgetProviderInfo 描述符。
  • android:resource – 指定 AppWidgetProviderInfo 资源位置。

三、简单示例

Android 小部件主要是用到AppWidgerProvider类处理应用微件广播、RemoteViews类处理布局。

在res/xml下新建一个appwidget.xml这个是定义小控件的配置信息。

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget" android:minWidth="100dp" android:minHeight="50dp" android:widgetCategory="home_screen" />

这个是res/layout/widget.xml布局文件,在桌面上显示的就是这个

<LinearLayout 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/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="mybutton" />
</LinearLayout>

下面是继承了AppWidgetProvider的类

public class MyWidget extends AppWidgetProvider { 
   

    private String CLICK_ACTION = "com.example.myremoteview.action";
    
    public MyWidget() { 
   
        super();
    }
    
    @Override
    public void onReceive(Context context, Intent intent) { 
   
        super.onReceive(context, intent);
        //小控件点击 
        if (intent.getAction() == CLICK_ACTION) { 
   
            Toast.makeText(context, "click", Toast.LENGTH_SHORT).show();
            Log.d("test", "click");
        }
        Log.d("test", intent.getAction());
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
   
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        Log.d("test", "onupdata");
        //发送点击广播 
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
        Intent intentClick = new Intent(CLICK_ACTION);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentClick, 0);
        remoteViews.setOnClickPendingIntent(R.id.button,pendingIntent);
        //下面一定要加上不然不会触发点击 
        appWidgetManager.updateAppWidget(appWidgetIds,remoteViews);
        }
    }

最后是清单文件的主要代码

<receiver android:name=".MyWidget">
    <meta-data android:resource="@xml/appwidget" android:name="android.appwidget.provider">
    </meta-data>
    <intent-filter>
        <action android:name="com.example.myremoteview.action" /><!--这个是点击的action-->/>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /><!--这个标识小控件的action-->/>
    </intent-filter>
</receiver>

相关参考
创建应用程序小部件:https://developer.android.com/develop/ui/views/appwidgets/overview
应用微件概览:https://developer.android.com/guide/topics/appwidgets/overview?hl=zh-cn
构建应用微件:https://developer.android.com/guide/topics/appwidgets?hl=zh-cn
应用微件设计指南:ttps://developer.android.com/guide/practices/ui_guidelines/widget_design?hl=zh-cn#anatomy_determining_size
RemoteViews:https://android-dot-google-developers.gonglchuangl.net/reference/android/widget/RemoteViews
快捷方式:
https://developer.android.com/guide/topics/ui/shortcuts/creating-shortcuts?hl=zh-cn
https://developer.android.com/develop/ui/views/launch/shortcuts/creating-shortcuts

今天的文章android app widget_widget小组件[通俗易懂]分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/83028.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注