所谓桌面小控件,就是指能直接显示在Android系统桌面的小程序。一般来说,开发者可以把一些用户使用十分频繁的程序,比如时钟、指南针、日历等程序做成桌面控件,这样用户可以直接在桌面上看到程序的运行界面。

桌面小控件是通过Broadcast的形式来进行控制的,因此每个桌面小控件都对应于一个BroadcastReceiver。为了简化桌面小控件的开发,Android系统提供了一个APPWidgetProvider类,它就是BroadcastReceiver的子类,也就是说开发者开发桌面小控件只要继承APPWidgetProvider类即可。

为了开发桌面小控件,开发者只要开发一个继承APPWidgetProvider的子类,并重写APPWidgetProvider不同状态的生命周期方法即可。APPWidgetProvider里提供如下四个不同的生命周期方法:

1、onUpdate:负责更新桌面控件的方法;实现桌面控件通常会考虑重写该方法。

2、onDeleted:当一个或多个桌面小控件被删除时回调该方法。

3、onEnabled:当接收到ACTION_APPWIDGET_ENABLED  Broadcast时回调该方法。

4、onDisabled:当接收到ACTION_APPWIDGET_DISABLED  Broadcast时回调该方法。

一般来说,开发桌面小控件只需要定义一个APPWidgetProvider的子类。并重写它的onUpdate()方法即可,重写该方法按如下步骤进行:

1、创建一个RemoteViews对象,创建该对象时可以指定加载指定的界面布局文件。

2、如果需要改变上一步所加载的界面布局文件的内容,可通过RemoteViews对象进行修改。

【注】一般来说,RemoteViews所加载的界面中主要包含ImageView和TextView两种组件,RemoteViews提供了修改这两种组件的内容和方法。

3、创建一个ComponentName对象。

4、调用APPWidgetProvider更新桌面小控件。

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.widget.RemoteViews;

public class DeskTopApp extends AppWidgetProvider{
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
    System.out.println(java.util.Arrays.toString(appWidgetIds));
    //加载指定界面布局文件,创建RemoteViews对象
    RemoteViews remoteViews =
          new RemoteViews(context.getPackageName(), R.layout.activity_desk_top_app);
    // //为show ImageView设置图片
    // remoteViews.setImageViewResource(R.id.show, R.drawable.logo);
    //将APPWidgetProvider子类实例包装成ComponentName对象
    ComponentName componentName = new ComponentName(context, DeskTopApp.class);
    //调用APPWidgetManager将RemoteViews添加到ComponentName中
    appWidgetManager.updateAppWidget(componentName, remoteViews);
  }

}

由于APPWidgetProvider继承了BroadcastReceiver,因此APPWidgetProvider的本质还是一个BroadcastReceiver,为此需要在AndroidManifest.xml文件中使用<receiver.../>元素来配置它,配置该元素时需要为它指定相应的<intent-filter.../>和<meta-data.../>.

<receiver android:name=".DeskTopApp"
  android:label="@string/app_name"
  >
  <!-- 将该BroadcastReceiver当成桌面小控件 -->
  <intent-filter >
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
  </intent-filter>
  <!-- 指定桌面小控件的meta-data -->
  <meta-data
    android:name="@android:appwidget.provider"
    android:resource="@xml/appwidget_provider"/>
</receiver>

上面配置文件中指定该桌面小控件使用@xml/my_appwidget作为neta-data,因此还需要在应用的res\xml目录下添加appwidget_provider.xml文件。该文件的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!-- 指定该桌面组件的基本配置信息:
  minWidth:桌面小控件的最小宽度
  minHeight:桌面小控件的最小高度
  updatePeriodMills:更新频率
  initialLayout:初始时显示的布局-->

<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="150dp"
  android:minHeight="50dp"
  android:updatePeriodMillis="1000"
  android:initialLayout="@layout/activity_desk_top_app"
  >
</appwidget-provider>

posted on 2016-07-07 09:47  奋斗青年一族  阅读(485)  评论(0编辑  收藏  举报