最近在寫日歷AppWidget(小部件)代碼,遇到很多問題,AppWidget所支持的操作和View實在有限,動畫效果根本不支持,就連Intent啟動Activity、Service,和在TextView上顯示簡單的“HellWord”都顯得變態。實現了日歷小部件的日歷顯示、Button事件、翻頁動畫效果、onTouch事件等功能。下面就將整理的資料和自己的實踐寫了下來:
其實Appwidget是一個小型的Views,可以嵌入到其他應用程序並且定期更新。這些View被稱為Widgets組件,您可以通過AppwidgetProvider去發布Widgets,能夠容納其他Appwidget的稱為Appwidget host。
<receiver>需要android:name屬性,它指定Appwidget所使用的AppwidgetProvider.
<intent-filter>至少需要包含 android:name="android.appwidget.action.APPWIDGET_UPDATE",這個屬性指定AppwidgetProvider接收APPWIDGET_UPDATE廣播,這是唯一一個需要明確聲明的廣播。當需要時,AppWidgetManaget自動給所有Appwidget發生廣播.
<meta-data>指定了AppwidgetProviderInfo資源,需要一下屬性:android:name 指定metadata的名字。使用android.appwidget.provider將其作為AppwProviderInfo的描述性數據
Android:resource 指定AppwidgetProviderInfo資源的位置
一個Appwidget的基本屬性是通過AppwidgetproviderInfo去定義的,例如它的最小尺寸的布局,它的初始layout,多久更新Appwidget,還有(可選)在創建時期配置一個Activity。在xml資源中定義一個AppwidgetproviderInfo是通過<appwidget-provider>標簽,並保存在工程的res/xml/文件夾下,例如:
Configure屬性是當用戶添加一個AppWidget前啟動一個Activity,這個Activity的作用就是配置Appwidget的屬性。
只要你屬性用xml怎麼去定義layout的話,為appwidget定義一個layout還是很簡單的。但是由於Appwidget的布局是基於RemoteVIew,所以只能使用RemoteViews(後面篇章將會對RemoteViews做詳細分析)所支持的 layout(FrameLayout,LinearLayout,RelativeLayout)或者view(AnalogClock, Button , Chronometer ,ImageButton, ImageView, ProgressBar, TextView注意:繼承這些類的子類同樣不支持)。
Appwidgetprovider是BroadcastReceiver的子類,這個類處理Appwidget的廣播。
Appwidgetprovider只接受於Appwidget有關系的廣播,比如Appwidget在update,deleted,enabled,disable。當這些廣播發生的時候,AppWidgetProvider會調用一下回調方法:
間隔調用此方法去更新Appwidget,間隔時間的設置時在AppwidgetproviderInfo下的updatePeriodMillis屬性,同樣當用戶添加Appwidget的時候也被調用。如果你已經聲明了一個configuration Activity,用戶添加Appwidget的時候就不會調用onUpdate,但是隨後的更新中依然會被調用。
onDeleted(Context, int[])
當Appwidget從Appwidget host中刪除的時候調用
onEnabled(Context);
當Appwidget第一次創建的時候調用。比如,當用戶增加兩個同樣的Appwidget的時候,這個方法只在第一次去調用。如果你需要打開一個新的數據庫或者其他的設置,而這在所有的Appwidget只需要設置一次的情況下,這個是最後的地方去實現它們。
onDisabled(Context)
當Appwidget的最後一個實例從Appwidget host中刪除的時候調用。這裡可以做一些在onEnabled(Context)中相反的操作,比如刪除臨時數據庫。
onReceive(Context, Intent)