所谓桌面小控件,就是指能直接显示在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,因此还需要在应用的resxml目录下添加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>