所谓桌面小控件,就是能显示在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讲义》