1. 基本信息

App Widget是一种可以被放在其他应用中(如Launcher)并接收周期性更新的应用视图。这些视图在UI上就表现为Widget,并且你可以同App Widget Provider一起发布。
要创建一个App Widget,你需要完成以下步骤:

  • AppWidgetProviderInfo对象:它描述了App
    Widget的基本元素,比如说布局、更新频率、AppWidgetProvider类等。这些都是在xml文件中定义的。
  • 2.AppWidgetProvider类的实现:它定义了一些基本的方法以支持通过广播事件与App Widget交互。通过它,当App Widget被更新、启用、禁用以及删除时,你将收到相应的广播信息。
  • 3.View Layout:通过xml文件定义App Widget的初始视图。

2. 添加App Widget布局

另外,你还可以实现一个App Widget的配置Activity。当然,这不是强制的。
要创建你的App Widget的初始布局,你可以使用以下View对象。
创建布局不是很麻烦,重点是,你必须记住,这个布局是基于RemoteViews的,不是所有的布局类型与View都支持。
一个RemoteViews对象可以支持以下布局类:

FrameLayout LinearLayout RelativeLayout

以及一下widget类

AnalogClock Button Chronometer ImageButton
ImageView ProgressBar TextView ViewFlipper

注:这些类的子类是不支持的。
res/layout文件夹下创建widget.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextView android:layout_width="wrap_content" android:layout_height="wrap_content"android:text="当前时间" android:textColor="@android:color/white" android:textSize="18sp" android:id="@+id/tv_weather"/>
</LinearLayout>

3. 添加AppWidgetProviderInfo元数据

res/xml文件夹下创建weather.xml文件

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  android:minWidth="294dp"  android:minHeight="72dp"  android:updatePeriodMillis="86400000"  android:previewImage="@drawable/preview"  android:initialLayout="@layout/widget"  android:configure="com.example.android.ExampleAppWidgetConfigure"   android:resizeMode="horizontal|vertical">
</appwidget-provider>  
  • minWidth与minHeight属性表示了App Widget所需的最小布局区域。
    默认的主屏中,App Widget要想确认其位置,需要通过基于网格的具有固定宽度和高度的单元。如果App Widget的最小宽度和高度无法匹配给定的单元,它将会自动扩展到最接近的单元大小。
    由于主屏的布局方向是可变的,你应该考虑最坏的情况(每单元的宽和高都是74dp)。然而,为了防止在扩展时产生整数计算错误,你还需要减去2。因此,你可以用以下公式来计算最小宽度和高度(单位dp):(单元数量×74)-2。
    同时,为了保证你的App Widget能够在各种设备上正常使用,它们的宽度和高度必须不超过4×4个单元。

  • updatePeriodMillis属性定义了App
    Widget框架调用AppWidgetProvider的onUpdate方法的频率。对于实际的更新,我们不建议采用该值进行实时处理。最好是越不频繁越好——为了保证电量,一小时不超过一次为好。当然,你也可以允许用户对更新频率进行设置。
    注意,如果更新触发时设备正处于休眠状态,设备将唤醒以执行该操作。如果你的更新频率不超过一小时一次,这不会对电池的寿命产生多大的影响。但如果你需要更频繁地更新却又不想要在设备休眠时执行,那你可以使用定时器来执行更新。要达到这种目的,可以在AlarmManager中设置一个AppWidgetProvider能接收的Intent。将类型设为ELAPSED_REALTIME或RTC。由于AlarmManager只有当设备处于唤醒状态时才会被调用,我们只要设updatePeriodMillis为0即可。

  • linitialLayout属性标识了初始布局文件。
  • configure属性定义了当用户添加App Widget时调用的Activity。(这是可选的)
  • previewImage定义了App
    Widget的缩略图,当用户从widget列表中选择时,显示的就是这张图。如果没设置,用户将看见的是你的应用的默认图标。
  • autoAdvanceViewId属性是在Android3.0引入的,用于标识需要被host(launcher)自动更新的widget的子视图。
  • resizeMode属性标识了widget重新布局的规则。你可以使用该属性来让widget能够在水平、竖直、或两个方向上均可变化。可用的值包括horizontal、vertical、none。如果是想在两个方向上均能拉伸,可设置为horizontal|vertical,当然,需要Android3.1以上版本。

4. 使用AppWidgetProvider类

public class ClockProvider extends AppWidgetProvider {@Overridepublic void onEnabled(Context context) {super.onEnabled(context);Intent _intent = new Intent(context, ClockService.class);context.startService(_intent);}@Overridepublic void onDisabled(Context context) {super.onDisabled(context);Intent _intent = new Intent(context, ClockService.class);context.stopService(_intent);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);}}
  • onUpdate()
    由updatePeriodMills定义的时间间隔触发。当然,添加Widget的时候也会,因此,应该在此处执行一些必要的配置,如定义View的事件处理handler,有必要的话,还会启动一个临时的Service。然而,如果你声明了一个配置Activity,该方法将不会在此时被调用。

  • onDelete(Context, int[])
    当App Widget从host中移除时会被调用。

  • onEnabled(Context)
    当App Widget的实例被第一次创建时,该方法将被调用。如果你建了两个实例,那该方法也只会被调用一次。
  • onDisabled(Context)
    当最后一个App Widget的实例被删除时,该方法被调用。你可以在此处清除之前在onEnabled里执行的操作。

  • onReceive(Content, Intent)
    每次接收到广播都会被调用,而且执行的顺序在上述方法之前。通常,你不需要实现该方法,因为AppWidgetProvider已经对各种不同类型的广播进行了过滤及分发。
    注:在Android1.5中,有一个已知的问题,使得在某些情况下,onDeleted不会被调用。这时,你就需要实现onReceive()了。

5. 使用Service更新数据

public class ClockService extends Service implements AMapLocalWeatherListener {private LocationManagerProxy mLocationManagerProxy;public SimpleDateFormat sdf;public Timer timer;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();System.out.println("start");sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {String time = sdf.format(new Date());updateViews(time);}},0,1000);}private void updateViews(String info){Intent _intent = new Intent(this, MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, _intent, 0);RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget);views.setTextViewText(R.id.tv_weather, info);views.setOnClickPendingIntent(R.id.tv_weather, pendingIntent);//点击跳到主页AppWidgetManager manager = AppWidgetManager.getInstance(this);ComponentName name = new ComponentName(this, ClockProvider.class);manager.updateAppWidget(name,views);}@Overridepublic void onDestroy() {super.onDestroy();timer.cancel();}
}

通过RemoteViews类和AppWidgetManager类发送广播更新界面数据

6.在AndroidManifest中声明一个App Widget

<service android:name=".ClockService"></service><receiver android:name=".ClockProvider"><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action></intent-filter><meta-data
                    android:name="android.appwidget.provider"android:resource="@xml/weather"></meta-data></receiver>

meta-data标签标识了AppWidgetProviderInfo资源,它需要以下属性:
android:name:使用android.appwidget.provider来标识AppWidgetProviderInfo。
android:resource:标识AppWidgetProviderInfo的资源位置。

App Widget相关推荐

  1. APP Widget的开发

    Android中经常用到APP Widget,如时钟,天气预报等. 长按屏幕,在弹出的对话框中选择"窗口小部件",然后就列出了可选择的小部件,这些小部件就是APP Widget. ...

  2. Android桌面组件App Widget开发三步走

    桌面组件App Widget是Android的实用功能,开发过程虽然不是很难,但是步骤不少,略有麻烦.为了方便以后再次使用的时候,快速上手,概括了下面的关键步骤.并且把项目打了包,方便以后的使用.新建 ...

  3. Android 之窗口小部件详解--App Widget

    1 App Widget简介 App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widge ...

  4. Android 之窗口小部件高级篇--App Widget 之 RemoteViews - 跨到对岸去

    在之前的一篇博文( Android 之窗口小部件详解--App Widge t)中,已经介绍了App Widget的基本用法和简单实例.这篇主要讲解 App Widget 的高级内容,即通过 Remo ...

  5. Android App Widget中如何调用RemoteView中的函数

    我们在开发App Widget时候,要创建一个RemoteView来呈现界面.但是会发现如果我们想要控制RemoteView中的view时候是无法使用findViewbyId来控制Child View ...

  6. Android App Widget 开发

    概述 App Widget是应用程序窗口小部件(Widget),是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget Provider来 ...

  7. Android 桌面组件【app widget】 进阶项目--心情记录器

    之前有一篇是初探 Android App Widget 的文章,今天继续对上一例子进行扩展,并完成了一个小项目,直接可以拿来使用.上篇文章地址:Android 桌面组件[widget]初探 ,未接触过 ...

  8. (4.0.24.2)Android之桌面组件App Widget案例之高仿墨迹天气桌面组件

    相信墨迹天气,大家都见过,他在时间显示和天气界面上,很吸引人,今天我就来模仿一下墨迹天气的桌面组件,但是由于谷歌在天朝频频被墙的缘故,所以我在今天测试的时候,解析xml文件的网页打不开,所以天气显示出 ...

  9. 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第七章 App Widgets...

    第7章 App Widgets App Widgets是一个应用程序的微型视图,可以嵌入到其他应用程序(如主屏幕)并且能够定期更新.你可以发布一个应用程序的App Widget,而这些视图称为窗口的用 ...

最新文章

  1. 四舍六入五成双银行家算法的 PHP和Javascript实现
  2. HBase在淘宝的应用和优化小结
  3. oracle中那个日期怎么相减_二手车鉴定中最容易混淆的日期读法,你会是那个读错的人吗?...
  4. mybatis-day1入门案例
  5. html js php 混编,Razor标记语言和HTML,js混编
  6. mysql的安装胚子_下列哪个制剂是以主要药味缩写加剂型的原则命名的
  7. 您的屁股发热严重,请降温后使用。
  8. javascript 懒加载技术(lazyload)简单实现
  9. java在线编辑器_微软开源在线代码编辑器——Monaco Editor
  10. toj 4614 Infinite Dictionaries
  11. java实现关键词云_Java synchronized 关键字的实现原理
  12. java比较两个类的值不相同_java 反射---------比较两个相同类型的对象相同属性的属性值是否相同的具体调用...
  13. 统计信号处理基础-估计与检测理论的学习过程
  14. python开发酷q插件gui_酷Q的SDK模块机器人个人开发插件
  15. 不使用脚手架构建vue项目
  16. Python实现二维码扫码登录
  17. hosts文件位置在哪
  18. 淘宝店铺订单同步及获取解决方案
  19. 关于iPhone删除无法删除的描述文件
  20. 纸浆暴力反弹——复制去年走势,铁矿石认购2-4倍,双硅价差再度翘尾?2022.6.28

热门文章

  1. 计算机基础知识 事业编,事业单位考试计算机基础知识大全.doc
  2. 老子道德经81章全文及解释
  3. amd插帧技术如何开启_不要浪费那块屏幕,联想小新13 Pro AMD锐龙标压版视频插帧设置...
  4. 您的 MAD 得分是多少?| MAD Skills
  5. 温湿度绝对含水量换算公式
  6. linux命令——查找文件大小大于1M的文件
  7. PTA 7-33 有理数加法(详解)
  8. 电子邮件服务器名设置方法,电子邮件 outlook express 怎样设置电子邮件服务器名?...
  9. Python入门学习笔记
  10. IDEA中如何正确快速打jar包(包括瘦包、胖包)