为了实现一个数字时钟的桌面组件,开发者需要在程序界面上定义8个ImageView,其中6个ImageView用于显示小时、分钟、秒钟的数字,另外两个ImageView用于显示小时、分钟、秒钟之间的冒号。
为了让桌面组件实时的显示当前时间,程序需要每个1秒更新一次程序界面上的6个ImageView,让它们显示当前小时、分钟、秒钟的数字即可。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.widget.RemoteViews;
public class DigitalClock extends AppWidgetProvider{
private Timer timer = new Timer();
private AppWidgetManager appWidgetManager;
private Context context;
//将0~9的液晶数字图片定义成数组
private int[] digits = new int[]{
R.drawable.su01,
R.drawable.su02,
R.drawable.su03,
R.drawable.su04,
R.drawable.su05,
R.drawable.su06,
R.drawable.su07,
R.drawable.su08,
R.drawable.su09,
R.drawable.su10,
};
//将显示小时、分钟、秒钟的ImageView定义成数组
private int[] digitViews = new int[]{
R.id.image01,
R.id.image02,
R.id.image04,
R.id.image05,
R.id.image07,
R.id.image08,
};
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
this.appWidgetManager = appWidgetManager;
this.context = context;
//定义计时器
timer = new Timer();
//启动周期性调度
timer.schedule(new TimerTask() {
@Override
public void run() {
// 发送空消息,通知界面更新
handler.sendEmptyMessage(0x123);
}
},0,1000);
}
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
if(msg.what == 0x123){
RemoteViews views =
new RemoteViews(context.getPackageName(), R.layout.activity_digital_clock);
//定义SimpleDateFormat对象
SimpleDateFormat df = new SimpleDateFormat("HHmmss");
//将当前时间格式化成HHmmss的形式
String timeStr = df.format(new Date());
for(int i = 0 ; i< timeStr.length();i++){
//将第i个数字字符串转换为对应的数字
int num = timeStr.charAt(i) - 48;
//将第i个图片设为对应的液晶数字图片
views.setImageViewResource(digitViews[i], digits[num]);
}
//将APPWidgetProvider子类实例包装成ComponentName对象
ComponentName componentName = new ComponentName(context, DigitalClock.class);
//调用APPWidgetProvider将RemoteViews添加到ComponentName中
appWidgetManager.updateAppWidget(componentName, views);
}
super.handleMessage(msg);
}
};
}
上面的程序中粗体字代码将会根据程序的时间字符串动态更新6个ImageView所显示的液晶数字图片,这样即可通过液晶数字来显示当前时间了。
在AndroidManifest.xml文件中添加如下代码片段来定义该桌面的小控件:
<receiver
android:name=".DigitalClock"
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>