所谓桌面小控件,就是能之间显示在Android系统桌面的小程序。
桌面小控件的实现是基于Broadcast的形式实现的,因此,每一个桌面小控件都对应于一个BroadcastReceiver类。Android系统提供了一个AppWidgetProvider类(它就是BroadcastReceiver的子类),这个类很关键,你在写桌面小控件时只需继承这个类就行。继承了AppWidgetProvider类之后,你可以根据自己的需要覆盖它的不同的生命周期的方法,来达到自己的目的。AppWidgetProvider类的主要提供如下不同生命周期的方法:
void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { }
// 这个方法字面意思是负责更新桌面小控件,但貌似只有在小控件被用户放到桌面上时被调用了一次,读者可以自己通过输出Log来测试
// 实现桌面控件是通常都会考虑重写该方法
void onDeleted(Context context, int[] appWidgetIds)
// 在小控件被删除时调用该方法
一般来说,开发桌面小控件只需要定义一个AppWidgetProvider的子类,并重新写它的pnUpdate方法即可。
下面上代码,有不足之处请指教:
DesktopClock.java,这个类继承了上面说的AppWidgetProvider类(记住它是继承自BroadcastReceiver类):
package org.ls;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;
public class DesktopClock extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Log.e("appwidget", "--update--");
// 创建RemoteViews对象
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.main);
views.setImageViewResource(R.id.double_dot,
R.drawable.blue_modern_middle);
// 将刷新UI的service的必要的数据设置好(此处没有使用Bundle传递数据)
UpdateUIService.appWidgetManager = appWidgetManager;
UpdateUIService.context = context;
UpdateUIService.remoteViews = views;
// 启动刷新UI的Service
Intent intent = new Intent(context, UpdateUIService.cla