Android AppWidgets的原理和应用

 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实例IDAppWidgetManager来绘制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()如果有广播的话,那么该方法会被调用。

 

你可能感兴趣的:(android,框架,layout,Class,action)