AppWidgets生命周期:
1. Widget定义
2. Widget实例创建
3. onUpdate() (当设定的时间过去后)
4. 响应在屏幕上的widget窗口点击事件
5. Widget 从home屏幕删除
6. 卸载
AppWidgets在AndroidManifest.xml中的定义如下:
<manifest..> <application> .... <receiver android:name=".NewsWidgetProvider"> <meta-data android:name="android.appwidget.provider" android:resource="@xml/news_appwidget_provider" /> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> </receiver> ... <activity> ..... </activity> <application> </manifest>
由此可以看出AppWidgets就是一个receiver对象,在intent-filter中定义的action"android.appwidget.action.APPWIDGET_UPDATE"是AppWidgets必须接收的广播Action。而对应的resource属性显示了AppWidgets的配置信息。示例如下:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="150dp" android:minHeight="120dp" android:updatePeriodMillis="43200000" android:initialLayout="@layout/news_widget" android:configure="com.abc.android.NewsWidget.ConfigureNewsWidgetActivity" > </appwidget-provider>
minWidth,minHeight分别对应AppWidgets在屏幕中的最小宽度和高度,构成了在屏幕中显示的实际大小,如果参数之一大于屏幕的实际的参数,那么添加这个AppWidgets就会弹出提示屏幕空间不够的消息。updatePeriodMillis定义了AppWidgets的更新周期,单位为ms。configure定义了配置Activity的类名称,initialLayout定义了初始的AppWidgets的布局文件。示例如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="150dp" android:layout_height="120dp" android:background="@drawable/box1" > <TextView android:id="@+id/bdw_w_name" android:layout_width="fill_parent" android:layout_height="30dp" android:text="Anonymous" android:background="@drawable/box1" android:gravity="center" /> </LinearLayout>
可以看出它的布局文件就是一个普通的布局文件,需要注意的是它的布局元素仅支持以下的几种类型(并且其子类也不被支持):
FrameLayout
LinearLayout
RelativeLayout
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
了解AppWidgets的大概框架后,我们需要介绍其创建过程。首先是配置Activity的实现(它并不是必须的,起到对AppWidgets信息的配置作用)。当用户从菜单中选择对应的AppWidgets时,首先弹出的是它的配置Activity,所以需要配置Activity执行以下操作:
1. 获取widget实例ID。
2. 给用户提示需要输入保存的信息。
3. 保存widget实例以备后面的widget更新时能够获取所设置的信息。
4. 通过制定对应的布局和创建一个对应RemoteViews对象准备首次显示widget视图。
5. 调用RemoteViews对象方法设置对应的值,同时注册按钮点击事件消息等。
6. 通过传递widget实例ID到AppWidgetManager来绘制RemoteViews对象到home屏幕。
7. 返回widget实例ID并关闭。
剩下的就是执行对应的Receiver的过程,请看如下示例:
public class NewsWidgetProvider extends AppWidgetProvider { public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds){} public void onDeleted(Context context, int[] appWidgetIds){} public void onEnabled(Context context){} public void onDisabled(Context context) {} public void onReceive(Context context,Intent intent){} }
onEnabled()第一次添加一个widget到桌面的时候会调用这个方法。可以在里面做一些初始化,比如启动一个后台服务。
onUpdate()在更新周期到来的时候会被调用,如果设置了配置Activity,那么在第一次将调用配置Acitivity,然后在更新周期到来的时候将被调用。
onDisabled()桌面最后一个widget被删除的时候将调用此方法。
onDeleted()一般在一个widget被删除的时候调用此方法。
onReceive()如果有广播的话,那么该方法会被调用。