随着Android 1.5的普及很多网友发现SDK中多出了appwidget这个框架。作为使用Java语言设计的Widget相比目前主流的W3C Widget有更好的运行效率和底层控制能力,今天我们就Android平台上的Widget开发做主要的讲解。
首先我们需要在androidmanifest.xml文件中加入receiver节点来接收系统广播,声明BroadcastReceiver类的方法可以直接使用intent filter来过滤系统信息,下面来自SDK中的写法。
<receiver android:name="TestAppWidgetProvider" android:label="@string/cwj" android:icon="@drawable/smart_icon">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> //这里我们需要捕获的是APPWIDGET_UPDATE这个动作
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" /> //定义meta数据,见下面的appwidget-provider
</receiver>
我们定一个AppWidgetProviderInfo 结构,用来描述这个widget的外观,这里和layout的布局有些相似,可以设置最小的宽度为40dp,最小高度为30dp。
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="40dp"
android:minHeight="30dp"
android:updatePeriodMillis="86400000" //回调Timer,单位为毫秒。这里是1天=60X60X24X1000,Android手机的电能有限,频率不能太高,最好让用户自己控制
android:initialLayout="@layout/test_appwidget" //初始化时的主要布局
android:configure="com.android.tests.appwidgethost.TestAppWidgetConfigure" >
</appwidget-provider>
在Widget中主要使用AppWidgetProvider做基类,刚才我们定义的BroadcastReceiver主要是更新动作ACTION_APPWIDGET_UPDATE ,与此之外还有ACTION_APPWIDGET_DELETED、ACTION_APPWIDGET_ENABLED和ACTION_APPWIDGET_DISABLED分别表示删除是、启用和禁用时触发的事件,这里是系统广播。我们通过 BroadcastReceiver类的onReceive方法来捕获。
下面的Java广播动作获取代码如下:
public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); //获取当前的动作
if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) { //如果是ACTION_APPWIDGET_UPDATE动作则
Bundle extras = intent.getExtras();
if (extras != null) {
int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
if (appWidgetIds != null && appWidgetIds.length > 0) {
this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
}
}
}
else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { //动作2
Bundle extras = intent.getExtras();
if (extras != null) {
int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
if (appWidgetIds != null && appWidgetIds.length > 0) {
this.onDeleted(context, appWidgetIds);
}
}
}
else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) { //动作3
this.onEnabled(context);
}
else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) { //动作4
this.onDisabled(context);
}
}
本文我们主要简单的讲述下Android平台Widget的框架,以后我们将会通过实际的例子来讲解,我们看到这里的widget和常见的iphone上dashboard等w3c使用html+js以ajax方式的小工具不太一样,不过整体开发起来比android标准的程序更简单,主要是考虑ui的绘制以及网络通讯,推荐大家多看看apache通讯类。
RSS