Android桌面时间控件

  所谓桌面小控件,就是能显示在Android系统桌面的小程序

   Android系统提供了一个AppWidgetProvider类(它就是BroadcastReceiver的子类),这个类很关键,你在写桌面小控件时只需继承这个类就行。继承了AppWidgetProvider类之后,你可以根据自己的需要覆盖它的不同的生命周期的方法,来达到自己的目的。
  下面上代码,有不足之处请指教:
主程序:
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;
import android.widget.TextView;


public class LedClock 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.img01, R.id.img02, R.id.img04,
			R.id.img05, R.id.img07, R.id.img08 };

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
	
	    this.appWidgetManager = appWidgetManager;
		this.context = context;
		// 定义计时器
		timer = new Timer();
		// 启动周期性调度
		timer.schedule(new TimerTask() {
			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.main);
				// 定义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,
						LedClock.class);
				// 调用AppWidgetManager将remoteViews添加到ComponentName中
				appWidgetManager.updateAppWidget(componentName, views);
			}
			super.handleMessage(msg);
		}
	};
}
XML文件:
1、自定义xml文件(放在xml文件中)
<?xml version="1.0" encoding="utf-8"?>
<!-- 指定该桌面组件的基本配置信息:
	minWidth:桌面控件的最小宽度。
	minWidth:桌面控件的最小高度。
	updatePeriodMillis:更新频率
	initialLayout:初始时显示的布局 -->
<appwidget-provider
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:minWidth="3000dp"
	android:minHeight="0dp"
	android:updatePeriodMillis="1000"
	android:initialLayout="@layout/main"/>
2、初始化Layout
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
	android:layout_height="match_parent"
    >

<!-- 定义6个ImageView来显示液晶数字 -->

	<LinearLayout
	    android:layout_height="match_parent"
	    android:layout_width="match_parent"
	    android:orientation="horizontal"	    
	    >
	    
	<ImageView
 	   android:id="@+id/img01"
	   android:layout_width="20dp"
	   android:layout_height="40dp" 
	   android:src="@drawable/su10"
	   />

	<ImageView
	    android:id="@+id/img02"
		android:layout_width="20dp"
	    android:layout_height="40dp" 
	    android:src="@drawable/su10"
	  />
	<!-- 定义1个TextView来显示冒号  : 来分隔时间 -->
	<TextView
	    android:id="@+id/text03"
	    android:layout_width="20dp"
	    android:layout_height="40dp" 
	    android:gravity="center"
	    android:textStyle="bold"  <!-- 用来加粗字体 -->
	  	android:text=":"
	  	android:textSize="40dp"
	  />
	
	<ImageView
	    android:id="@+id/img04"
	    android:layout_width="20dp"
	    android:layout_height="40dp" 
	    android:src="@drawable/su10"
	   />

	<ImageView
	    android:id="@+id/img05"
	    android:layout_width="20dp"
	    android:layout_height="40dp" 
	    android:src="@drawable/su10"
	   />
	
	<TextView
	    android:id="@+id/text06"
	    android:layout_width="20dp"
	    android:layout_height="40dp" 
	    android:gravity="center"
	    android:textStyle="bold"
	  	android:text=":"
	  	android:textSize="40dp"
	   />
	
	<ImageView
 	    android:id="@+id/img07"
	    android:layout_width="20dp"
	    android:layout_height="40dp" 
 	    android:src="@drawable/su10"
 	   />

	<ImageView
	    android:id="@+id/img08"
	    android:layout_width="20dp"
	    android:layout_height="40dp" 
	    android:src="@drawable/su10"
	   />
	
	</LinearLayout>
</FrameLayout>
3、AndroidManifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest
	xmlns:android="http://schemas.android.com/apk/res/android"
	package="org.crazyit.desktop"
	android:versionCode="1"
	android:versionName="1.0">
	<uses-sdk
		android:minSdkVersion="10"
		android:targetSdkVersion="17" />
	<uses-permission android:name="android.permission.INTERNET"/>
	
	<application
		android:icon="@drawable/ic_launcher"
		android:label="@string/app_name">
		<receiver
			android:name=".LedClock"
			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/my_clock" />
		</receiver>
	</application>
</manifest>

另外,res文件夹中包含有所需要的0~9数字的图片,读者可通过百度搜索获得。

本文代码参考李刚《疯狂Android讲义》




你可能感兴趣的:(android,控件,安卓时间控件)