App Widgets在Android中是作為嵌入到其他應(yīng)用中的小的應(yīng)用視圖存在的,這在進行背景音樂播放、社交網(wǎng)絡(luò)信息瀏覽、天氣狀況查詢、交通狀況查詢等需要定期更新的業(yè)務(wù)時顯得非常有用。駐留了App Widgets的應(yīng)用組件稱為App Widgets宿主。
為了創(chuàng)建一個App Widget,開發(fā)者需要完成3個方面的工作:
1)定義AppWidgetProviderInfo對象
定義一個AppWidgetProviderInfo對象。為了描述App Widget的屬性,如布局、刷新頻率和AppWidgetProvider,需要在XML文件中定義一個AppWidgetProviderInfo對象。
下面是samples\ApiDemos\res\xml\appwidget_provider.xml中的一個例子:
代碼1-1 appwidget_provider.xml
< appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="60dp"
android:minHeight="30dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/appwidget_provider"
android:configure="com.example.android.apis.appwidget.ExampleAppWidgetConfigure">
< /appwidget-provider>
在samples\ApiDemos\ AndroidManifest.xml中,通過receiver::Resource屬性設(shè)置數(shù)據(jù)源:
代碼1-2 AndroidManifest.xml
< receiver android:name=".appwidget.ExampleAppWidgetProvider">
< meta-data android:name="android.appwidget.provider" //組件名
android:resource="@xml/appwidget_provider" /> //數(shù)據(jù)源
< intent-filter>
< action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
< /intent-filter>
< /receiver>
2)重載App Widget接口
重載App Widget的基本接口,如AppWidgetProvider:: onUpdate()、AppWidgetProvider:: onDeleted ()、AppWidgetProvider:: onEnabled ()、AppWidgetProvider:: onDisabled ()等,實現(xiàn)可參考ExampleAppWidgetProvider.java。
3)定義App Widget的布局
定義App Widget的初始布局,如samples\ApiDemos\res\layout\ appwidget_configure.xml、samples\ApiDemos\res\layout\appwidget_provider.xml等。
另外,為了顯示App Widget,需要創(chuàng)建一個Activity,在實際的開發(fā)中,App Widget通常位于Home Screen中。需要注意的是,由于App Widget和數(shù)據(jù)源通常位于不同的進程中,為了更新數(shù)據(jù),需要用到RemoteViews類。
代碼1-3 updateAppWidget
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,int appWidgetId, String titlePrefix)
{
Log.d(TAG, "updateAppWidget appWidgetId="+appWidgetId+"titlePrefix="+ titlePrefix);
//通過getString()有利于字符串的本地化,可以通過java.util.Formatter提供格式字符串
CharSequence text=context.getString(R.string.appwidget_text_format,
ExampleAppWidgetConfigure.loadTitlePref(context, appWidgetId),
"0x"+Long.toHexString(SystemClock.elapsedRealtime()));
RemoteViews views=new RemoteViews(context.getPackageName(), R.layout.appwidget_ provider); //創(chuàng)建RemoteViews
views.setTextViewText(R.id.appwidget_text, text);
appWidgetManager.updateAppWidget(appWidgetId, views); //通知Widget管理器
}
App Widgets涉及的類包括android.appwidget.AppWidgetHost、android.appwidget. AppWidget HostView、android.appwidget.AppWidgetManager、android.appwidget.AppWidget Provider、android.appwidget.AppWidgetProviderInfo等。