为了实现一个数字时钟的桌面组件,开发者需要在程序界面上定义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>

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