今天,我们主要来写一个widget的桌面小部件。
写widget部件主要是由四个步骤:
1、首先创建一个xml布局文件activity_digit_clock.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="280dp"
android:layout_height="123dp">
<ImageView android:id="@+id/imageview" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:src="@drawable/frame" />
<TextView android:id="@+id/textview" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="#F00" android:textSize="35sp" android:gravity="center" />
</FrameLayout>
android:orientation="vertical" android:layout_width="280dp"
android:layout_height="123dp">
<ImageView android:id="@+id/imageview" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:src="@drawable/frame" />
<TextView android:id="@+id/textview" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="#F00" android:textSize="35sp" android:gravity="center" />
</FrameLayout>
2、在res下面创建xml文件夹并在xml下面创建appwidget_provider.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="146dp"
android:updatePeriodMillis="0"
android:initialLayout="@layout/activity_digit_clock">
</appwidget-provider>
解释一下:android:minWidth表示widget的最小宽度,
android:updatePeriodMillis表示widget的更新时间间隔,如果是0表示不更新,
android:initialLayout表示widget的布局文件。
3、创建组件类,该类继承AppWidgetProvider.
package com.Leo.digitclock;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.widget.RemoteViews;
public class DigitClockDemo extends AppWidgetProvider {
private Timer timer = new Timer();
private int[] appWidgetIds;
private AppWidgetManager appWidgetManager;
private Context context;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
this.appWidgetManager = appWidgetManager;
this.appWidgetIds = appWidgetIds;
this.context = context;
timer = new Timer();
timer.schedule(timerTask, 0, 1000);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case 1:
int n = appWidgetIds.length;
for (int i = 0; i < n; i++)
{
int appWidgetId = appWidgetIds[i];
RemoteViews views = new RemoteViews(context
.getPackageName(), R.layout.activity_digit_clock);
java.text.DateFormat df = new java.text.SimpleDateFormat(
"HH:mm:ss");
views.setTextViewText(R.id.textview, df
.format(new Date()));
appWidgetManager.updateAppWidget(appWidgetId, views);
}
break;
}
super.handleMessage(msg);
}
};
private TimerTask timerTask = new TimerTask()
{
public void run()
{
Message message = new Message();
message.what = 1;
handler.sendMessage(message); // 将任务发送到消息队列
}
};
}
onUpdate()是在Widget加载时或者android:updatePeriodMillis属性指定的时间,系统会自动调用该方法。
4、最后一点也是最关键的一点就是在AndroidManifest.xml文件中定义一个receiver,以便系统和Widget进行通讯。
<receiver android:name=".DigitClockDemo">
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_provider" />
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
完成以上步骤,编写桌面widget就完成。下面就是效果:
本文参考:android完全开发讲义