初步分析Android——桌面小组件App Widget Host

来源:互联网 发布:做数据分析有前途吗 编辑:程序博客网 时间:2024/04/28 23:03

Android 应用都提供有这些小组件。App Widget  就是我们通常所说的桌面小组件。就是放置在手机屏幕上的例如始终,日历,天气等组件,与一般应用程序有所不同,应用需要点击查看,而App Widget不需要点击即直观呈现其内容,当然appwidget也可以被设置为点击打开应用或其他屏幕。桌面小组件是帮助我们快速访问应用的工具。

App Widget: 参考官方API 指南: 点击打开链接

应用程序小部件是微型应用程序视图,可以嵌入到其他应用程序(如主屏幕)中,并接收定期更新。这些视图在用户界面中称为Widget,您可以使用App Widget提供程序发布视图。能够容纳其他App Widget的应用程序组件被称为App Widget主机。即APP Widget Host。

这个是官方的说法,简单来说就是一些放置在主屏幕中的微型视图,是可以定期更新的,几乎每台android 设备都有这种功能。


更新:  AppWidget可以被定时更新,如日历每天更新,时钟每分钟更新等。当然,也可以在App Widget的视图界面中加入类似刷新的小按钮,以进行实时更新,如天气预报。  一般在提到Widget部件或Widget程序时,指的是AppWidget;如果说到widget控件,则可能是指视图控件,如Button等。

操作: 通过在桌面(HomeScreen)中长按,在弹出的对话框中选择AppWidget部件来进行创建;或者在应用程序列表的AppWidget程序列表中选择并长按来创建。同一个AppWidget部件可以在桌面同时创建多个。每新建一个,实际上是生成了一个新的AppWidget实例。

          要删除桌面的Widget部件,只需长按并拖动到垃圾箱即可。


要创建一个App Widget,您需要以下内容:

(1)AppWidgetProviderInfo对象

(2)AppWidgetProvider 类


AppWidgetProviderInfo 对象:

描述App Widget的元数据,例如App Widget的布局,更新频率和AppWidgetProvider类。这应该在XML中定义。


<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"    android:minWidth="40dp"    android:minHeight="40dp"    android:updatePeriodMillis="86400000"    android:previewImage="@drawable/preview"    android:initialLayout="@layout/example_appwidget"    android:configure="com.example.android.ExampleAppWidgetConfigure"    android:resizeMode="horizontal|vertical"    android:widgetCategory="home_screen"></appwidget-provider>

注意:此处官方用了较为完整的写法,包括android:configure、android:resizeMode、android:widgetCategory。对于新手学习来说,不用这么麻烦,最简单的演示一遍。暂不涉及ExampleAppWidgetConfigure 类,此处定义example_appwidget_info.xml文件,只选择部分属性,最小宽度,最小高度,更新时间间隔,预览图片,指定初始化布局文件即可,这个布局文件自定义,example_appwidget.xml,简单地一个即可。

<?xml version="1.0" encoding="utf-8"?><appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"    android:minWidth="40dp"    android:minHeight="40dp"    android:updatePeriodMillis="100000"    android:previewImage="@mipmap/ic_launcher"    android:initialLayout="@layout/example_appwidget"></appwidget-provider>


example_appwidget.xml。这个布局文件中只用到TextView。

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:padding="8dp">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="horizontal">        <TextView            android:id="@+id/button"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textColor="@color/colorAccent" />    </LinearLayout></FrameLayout>


好了,改用的资源也有了,那现在可以告诉我这个<appwidget_provider></appwidget_provider>对应的xml文件有什么用了,包含appwidget基本信息的xml文件到底用在哪里?别急,看这里。。。。。。。。。。


AppWidgetProvider 类:桌面小组件提供者。利用这个类实现我们相关的功能,而AppWidgetProvider类需要在AndroidMainfest.xml文件中配置。

<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>
好了,这个是清单文件中的配置,指定 ExampleAppWidgetProvider ation即《meta-data》,而其中元数据对应的资源文件就是上文提到的appwidget_info.


重点总结:定义一个appwidget 首先在清单文件中配置好,这样即指定了AppWidgetProvider这个工作的类,又指定了用到的资源布局example_appwidget_info.xml,那就继承AppWidgetProvider类创建一个子类,配置基本信息完成example_appwidget_info.xml文件,至于其中用到的布局自定义即可。


以上是桌面小组件最简单的应用,当然我们要学习的不至于此!

AppWidgetProvider是Android中提供的用于实现桌面小工具的类,其本质是一个广播即BroadcastReceiver。

是不是很难理解,明明是一个广播,但是偏偏起了个Provider的名称,没办法,这就是桌面小组件提供者,是不是很容易混淆ContentProvider。


AppWidgetProvider 继承自 BroadcastReceiver,它能接收 widget 相关的广播,例如 widget 的更新、删除、开启和禁用等。 

onUpdate()
  当 widget 更新时被执行。
  同样,当用户首次添加 widget 时,onUpdate() 也会被调用,这样 widget 就能进行必要的设置工作(如果需要的话) 。但是,如果定义了 widget 的 configure属性(即android:config,后面会介绍),那么当用户首次添加 widget 时,onUpdate()不会被调用;之后更新 widget 时,onUpdate才会被调用。

onAppWidgetOptionsChanged()
  当 widget 被初次添加 或者 当 widget 的大小被改变时,执行onAppWidgetOptionsChanged()。

你可以在该函数中,根据 widget 的大小来显示/隐藏某些内容。可以通过 getAppWidgetOptions() 来返回 Bundle 对象以读取 widget 的大小信息,Bundle中包括以下信息:
  OPTION_APPWIDGET_MIN_WIDTH -- 包含 widget 当前宽度的下限,以dp为单位。
  OPTION_APPWIDGET_MIN_HEIGHT -- 包含 widget 当前高度的下限,以dp为单位。
  OPTION_APPWIDGET_MAX_WIDTH -- 包含 widget 当前宽度的上限,以dp为单位。
  OPTION_APPWIDGET_MAX_HEIGHT -- 包含 widget 当前高度的上限,以dp为单位。

onAppWidgetOptionsChanged() 是 Android 4.1 引入的。

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

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

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

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

  总结,AppWidgetProvider 继承于 BroadcastReceiver。实际上,App Widge中的onUpdate()、onEnabled()、onDisabled()等方法都是在 onReceive()中调用的;是onReceive()对特定事情的响应函数。

需要注意的是系统默认的小工具布局中只支持以下这些标签,如果用了列表以外的标签,会导致小工具加载错误:

    • FrameLayout、LinearLayout、RelativeLayout、GridLayout
    • AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper
    • ListView、GridView、StackView、AdapterViewFlipper

  • 关于AppWidget以后会作很深入分析,不足之处多多纠正!!!!




    原创粉丝点击