我們都知道android操作系統自帶了幾個Widget組件,比如帶指針的鐘表,一般在Home Screen上的那個表盤,它在哪裡呢? 我們其實在alarmclock這個包中可以看到,下面就來一起分析一下實現的方法。其實有關內部的更新在AnalogClock類已經完成了,這裡僅僅分析Widgets部分。
首先看下alarmclock中有關widgets的androidManifest.XML描述內容如下:
<receiver android:name="AnalogAppWidgetProvider" android:label="@string/analog_gadget-android123">
<intent-filter>
<action android:name="
android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@
XML/analog_appwidget" />
</receiver>
xml/analog_appwidget.XML的內容如下
<?XML version="1.0" encoding="utf-8"?>
<appwidget-provider XMLns:android="
http://schemas.android.com/apk/res/android"
android:minWidth="146dip"
//widget最小寬度 android:minHeight="146dip"
//widget最小高度 android:updatePeriodMillis="0"
//更新頻率,單位為毫秒
android:initialLayout="@
layout/analog_appwidget" >
</appwidget-provider>
layout/analog_appwidget.XML的內容如下
<AnalogClock XMLns:android="
http://schemas.android.com/apk/res/android"
android:dial="@drawable/appwidget_clock_dial" //表盤背景圖片
android:hand_hour="@drawable/appwidget_clock_hour" //時針圖片
android:hand_minute="@drawable/appwidget_clock_minute" //分針圖片
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
最後我們看下androidmanifest.XML中的receiver是如何觸發的,
AnalogAppWidgetProvider.Java的內容如下
public class
AnalogAppWidgetProvider extends
BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (AppWidgetManager.
ACTION_APPWIDGET_UPDATE.equals(action)) {
RemoteVIEws views = new RemoteVIEws(context.getPackageName(),
R.layout.analog_appwidget);
//這裡RemoteVIEws載入的布局文件
int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
AppWidgetManager gm = AppWidgetManager.getInstance(context);
gm.updateAppWidget(appWidgetIds, vIEws);
//開始執行刷新內容 }
}
}