Android-RemoteView-桌面小部件

学习自

《Android开发艺术探索》
https://developer.android.google.cn/guide/topics/appwidgets/#AppWidgetProvider
https://www.jianshu.com/p/88ee2bde693c

桌面小部件漫谈

桌面小部件同样是一种RemoteView,虽然桌面小部件我们很熟悉,但是为了更清晰地了解桌面小部件,我们先来看一下相关的官方文档。

下面内容来自于官方文档的桌面小部件开发指南-概览
Widgets are an essential aspect of home screen customization. You can imagine them as "at-a-glance" views of an app's most important data and functionality that is accessible right from the user's home screen. Users can move widgets across their home screen panels, and, if supported, resize them to tailor the amount of information within a widget to their preference.
小部件是桌面定制的一个重要的方面。你可以把他们想象为一个最重要的数据和从桌面可以访问的功能的一目了然的View。用户能够在桌面上移动小部件。如果提供了调整信息总量的功能,用户也可能根据自己的喜好来调整小部件的大小。

下面内容来自于官方文档的桌面小部件开发指南-创建小部件
App Widgets are miniature application views that can be embedded in other applications (such as the Home screen) and receive periodic updates. These views are referred to as Widgets in the user interface, and you can publish one with an App Widget provider. An application component that is able to hold other App Widgets is called an App Widget host.
应用小部件是一些微型的应用View,这些View能够给被嵌入到其他应用中(比如 主屏幕)并且定期接收更新。这些View在用户界面中被称作 小部件 ,你可以通过AppWidegetProvider来发布一个小部件。一个能够容纳其他应用小部件的应用程序组件被称作应用组件持有者。

一些常见的小部件

image.png | left | 352x126

image.png | left | 312x100

实现桌面小部件

下面呢,我们将会实现一个桌面小部件,功能是点击小部件的时候随机切换一张狗狗的图片,效果图如下

ViewPagerImageRecycle.gif | left | 370x204

定义一个小部件的流程如下:

  1. 定义小部件的布局
  2. 配置小部件
  3. 实现小部件
  4. 在清单文件中声明小部件

    AppWidgetProvider

    AppWidgetProvider是用于实现桌面小部件的类,实际上是一个广播接受者,因为他是 BroadcastReceiver 的子类,在是用该类的时候将其视为广播接受者即可。

public class AppWidgetProvider extends BroadcastReceiver

小部件的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/dogIV"android:layout_width="wrap_content"android:layout_height="wrap_content"android:scaleType="fitXY"android:src="@drawable/dog1" /></LinearLayout>

配置桌面小部件

在res/xml目录下建立一个描述桌面小部件的配置信息的xml文件,命名随意,我这里命名为了 dog_appwidget_provider_info.xml ,此文件的的作用是初始化Widget。

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:initialLayout="@layout/dog_appwidget"android:minHeight="84dp"android:minWidth="84dp"android:updatePeriodMillis="10000"></appwidget-provider>

appwidget-provider 的全部属性如下

  • minHeight&minWidth定了以Widget的最小宽高,当最小宽高不是桌面cell的倍数的时候,会取最接近的值。Google为我们提供了一个公式来赋值我们计算最小宽高所对应的cell数量:70 * n -30 ,n 是单元格的数量。
  • updatePeriodMillis,自动更新 Widget的周期,为了处于省电的目的,系统默认的最小更新时间是 30m ,但是有可能并不精确(只会再多不会再少),此属性并不能实时更新Widget。
  • previewImage, 用户添加小部件时候的预览照片,如果不设置则为APP的启动图标。
  • initialLayout,Widget的初始的布局文件。
  • configure,定义当添加Widget小部件的时候弹出的配置Widget的Activity,如果设置了此属性,那么用来设置Widget的Activity还需要添加一个filter才行,下面会讲。
  • resizeMode,如果用户定义了此属性,那么表明Widget是可以调整大小的,分为 horizontalvertical 分别表示可以横向或者纵向调整大小,当然也可以都设置 horizontal|vertical 表示横向纵向都可以调整大小。
  • keyboard,表示Widget可以出现的位置分别 home_screenkeyguard /主界面和锁屏。需要Android5.0及以上。

Configure

上面对各个属性的解释中说明了了想要配置Widget,还需要做一些额外的工作.
首先需要配置一下Activity

<!--.......--><intent-filter><action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/></intent-filter>
<!--.......-->

为Activity传入参数

//获取WidgetId
this.mWidgetId = intent.extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)

Activity还需要将WidgetId返回

var intent = Intent()
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)
this.setResult(android.app.Activity.RESULT_OK, intent)
finish()

实现桌面小部件

实现Widget需要继承AppWidgetProvider类来实现我们的自己的功能。AppWidgetProvider还提供了一方法这些方法标志着Widget状态的改变,这些方法在 onReceive 方法中调用。他们如下:

  • onEnable 当Widget第一此被添加到桌面的时候调用,该方法仅仅会调用一次,比如添加了两个相同的Widget,只有在添加第一个的时候才会调用此方法。
  • onUpdate,当小部件被添加时,或者每次小部件更新的时候都会调用一次次方法,小部件的更新由updatePeriodMillis来指定。在此方法中我们经常会做一些初始化的操作。
  • onDeleted, 没删除一次Widget都会调用一次
  • onDisabled: 当最后一个该类型的Widget被删除的时候调用此方法。
  • onAppWidgetOptionsChanged,当Widget大小改变时调用
  • onReceive,此方法属于广播接受者的方法,在AppWidgetProvider中的主要作用是接收不同类型的广播,然后根据广播来调用上面提到的方法。我们往往会重写此方法来实现我们自己的业务逻辑。
class DogAPPWidgetProvider : AppWidgetProvider() {companion object {val CLICK_ACTION = "com.example.it.studyremoteview.CLICK"}/*** 对接收的广播进行处理* 当接收到广播后随机切换一个狗狗的图片* */override fun onReceive(context: Context?, intent: Intent?) {super.onReceive(context, intent)//处理点击Widget的业务逻辑if (intent?.action == CLICK_ACTION) {//将会被设置的狗狗图片的资源IDvar clickIntent = Intent().setAction(CLICK_ACTION)var pendingIntent = PendingIntent.getBroadcast(context!!, 0, clickIntent, 0)var remoteViews = RemoteViews(context.packageName, R.layout.dog_appwidget).apply {setImageViewResource(R.id.dogIV, getDogResId())setOnClickPendingIntent(R.id.dogIV, pendingIntent)}var manager = AppWidgetManager.getInstance(context)manager.updateAppWidget(ComponentName(context, DogAPPWidgetProvider::class.java), remoteViews)}}/*** 小部件自动更新时触发* 在这里我们切换一下狗狗的图片* 此方法即起到了初始化的作用,也起到了更新Widget的作用* */override fun onUpdate(context: Context?, appWidgetManager: AppWidgetManager?, appWidgetIds: IntArray?) {super.onUpdate(context, appWidgetManager, appWidgetIds)appWidgetIds!!.forEach {var clickIntent = Intent().setAction(CLICK_ACTION)var pendingIntent = PendingIntent.getBroadcast(context!!, 0, clickIntent, 0)var remoteViews = RemoteViews(context.packageName, R.layout.dog_appwidget).apply {setImageViewResource(R.id.dogIV, getDogResId())setOnClickPendingIntent(R.id.dogIV, pendingIntent)}appWidgetManager!!.updateAppWidget(it, remoteViews)}}/*** 随机获取一张狗狗的图片的资源ID* */private fun getDogResId(): Int {//狗狗图片的资源IDvar ids = arrayOf(R.drawable.dog1, R.drawable.dog2)var index = Random().nextInt(2)//将会被设置的狗狗图片的资源IDreturn ids.get(index)}
}

在清单文件中声明小部件

<!--配置小部件-->
<receiver android:name=".DogAPPWidgetProvider"><meta-dataandroid:name="android.appwidget.provider"android:resource="@xml/dog_appwidget_provider_info" /><intent-filter><!--小部件的单击行为--><action android:name="com.example.it.studyremoteview.CLICK" /><!--这个ACTION是必须的--><!--这个常量如果背不过,可以在 AppWidgetManager.ACTION_APPWIDGET_UPDATE 找到--><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter>
</receiver>

上面的Action中,第一个 Click Action 是我们自己定义的用来表示单击事件的Action,第二个Action代表着更新Widget的Action,最后会调用 onUpdate 方法,这个Action必须存在,否则Widget不能够显式在小部件栏目中。

我们在上面提到的方法都有相应的Action,如果想调用对象的方法,请配置相应的Action

ACTION_APPWIDGET_UPDATE   -> onUpdate
ACTION_APPWIDGET_DELETED  -> onDeleted
ACTION_APPWIDGET_ENABLED  -> onEnable
ACTION_APPWIDGET_DISABLED -> onDisable
ACTION_APPWIDGET_OPTIONS_CHANGED -> onOperationChanged

总结

本文关于桌面小部件的学习就到此为止,在接下来的文章中,还有以一个实例的方式来学习桌面小部件。

转载于:https://www.cnblogs.com/slyfox/p/9340145.html

Android-RemoteView-桌面小部件相关推荐

  1. Android widget桌面小部件

    android小部件主要是用到RemoteViews这个类,和继承AppWidgerProvider. 在res/xml下新建一个appwidget.xml这个是定义小控件的配置信息. <app ...

  2. Android AppWidget(桌面小部件-音乐播放动画)

    桌面小部件基础篇:Android AppWidget (桌面小部件) 音乐播放 (动画实现)     一个音乐播放的柱状图(不会上传动图,自行脑补) 思路方案: 1,自定义View,widget 仅支 ...

  3. android remoteview 缓存,关于RemoteView的一点愚见(实现桌面小部件)

    RemoteView中的应用除了有通知栏的自定义之外,还有桌面小部件也是通过RemoteView以及AppWidgetProvider来完成的. 实际上AppWidgetProvider是一个广播,即 ...

  4. 手机bootstrap搜索框_这些桌面小部件,Android 手机可不能错过

    在开源.可玩性较高的安卓系统上,小部件呈现了与 iOS 不一样的魅力.它高度的灵活自由,使得安卓手机用户,更能对自己的手机桌面进行个性化的定制. 可在细数当下众多的安卓小部件里,哪些能在保持实用性的同 ...

  5. android 仿苹果 小组件,安卓仿ios14桌面小部件

    安卓仿ios14桌面小部件,是一个可以让安卓手机的界面看起来像苹果界面的软件,功能非常强大,它可以提供多种不同主题的壁纸桌面,随心选择,设置后的效果还是非常不错的,很有高级感,操作简单,上手也很快. ...

  6. Android AppWidget(桌面小部件)

    使用Android Studio 开发桌面小部件,闲来无事,自己动手做一个 AppWidget是应用程序窗口小部件(Widget)是微型的应用程序视图 官方文档链接:http://www.androi ...

  7. kwgt 歌词_这8款Android桌面小部件,能让你的Android好用很多倍

    安卓手机一直以来以其可玩性高而受到欢迎,即使是简单的桌面小部件,也有人能玩出花来.强大如 Zooper Widget 和 KWGT 等复杂且定制性极强的美化类桌面插件应用,抑或是朴实无华但又必不可少的 ...

  8. Android Widget——实现桌面小部件

    前言 在Android手机中,我们经常会看到各种桌面小部件,天气.音乐播放器.时间表盘等,这些都是桌面小部件的实例.本篇主要介绍桌面小部件开发的一些最基础的知识. Widget介绍 Widget并没有 ...

  9. Android桌面小部件AppWidget:音乐播放器桌面控制部件Widget(3)

     Android桌面小部件AppWidget:音乐播放器桌面控制部件Widget(3) Android桌面小部件AppWidget比较常用的场景就是音乐播放器,音乐播放器虽然通常在后台播放,但需要 ...

  10. android 仿苹果 小组件,仿ios14桌面小部件

    仿ios14桌面小部件,这是一款面向广大安卓手机用户推出的高仿iOS14桌面插件软件,大家可以使用这款软件快速完成自己想要的桌面显示,多种插件一键点击轻松完成设置过程,让大家体验到同款iOS14桌面强 ...

最新文章

  1. IntelliJ IDEA 快捷键快速实用篇
  2. poj 2454 Jersey Politics 随机化
  3. Js的Url中传递中文参数乱码的解决
  4. 《研磨设计模式》chap24 桥接模式bridge(1)基本概念
  5. 头回遇见网上找不到的问题,“缺少实例ID,实例ID是必需的”
  6. EBS请求查找运行详细信息
  7. linux启动mysql_【数据库】MySQL数据库入门学习
  8. 您的请求参数与订单信息不一致_[淘客订单检测]淘宝客订单检测接口,淘客订单查询API...
  9. 北大博士拟入职华政被网友抵制,她为何自愿放弃?
  10. (一)MySQL优化之索引优化
  11. 关于Django中的数据库操作API之distinct去重的一个误传
  12. [Silverlight入门系列]用TransformToVisual和Transform取得元素绝对位置(Location)
  13. (十二)通过Opencv blobFromImage实现数据标准化
  14. php js 报错信息,JavaScript中错误异常的分析(附示例)
  15. python中if语句中可用break_python跳出if语句
  16. PHP学习日记0_PHP、静态网页、动态网页、静态网站访问流程、动态网站访问流程
  17. 编程语言之scala基础
  18. 阿里EasyExcel对Excel复杂模版填充实现并设置单元格格式
  19. centos7 安装/卸载wps 无法启动 字体缺失(亲测有效)
  20. java产品经理_产品经理必懂的技术那点事儿:成为全栈产品经理

热门文章

  1. 量化投资_TB交易开拓者A函数和Q函数详解
  2. FreeRTOS学习---“信号量”篇
  3. windows下C++(Duilib)怎么实现拖拽文件得到文件目录
  4. 哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛)K
  5. 在pdf转图片的时候如何才能导入fitz模块
  6. cgb2108-day14
  7. bzoj4890: [Tjoi2017]城市
  8. 类之间的关系:依赖、泛化、实现、关联、聚合、组合
  9. STC12C5A60S2 AD引脚电压测量
  10. 软文发布怎么选择好的媒体发布平台?