之前的一些配置如mainfest.xml,xml/widget ,res/layout/my_widget的具体配置请参考API文档,有详细的介绍。
一。对widget的配置。
要实现对widget的configurate的设置有以下几点要注意的
Intent intent = new Intent();
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
new int[] { mAppWidgetId });
context.sendBroadcast(intent);
setResult(RESULT_OK, intent);
1.通过sendBroadcast把当前intent发送出去,action必须是AppWidgetManager.Action_APPWIDGET_UPDATE; 这样你写的WidgetProvider能接受到,因为widgetProvider本身就是reciver,action就是AppWidgetManager.Action_APPWIDGET_UPDATE,这样就能实现call widgetProvider
2.一定要写setResult(RESULT_OK, intent); 不然widget不会放到桌面上去(忘记了我测试了好久都没有出现。很郁闷的)
E/AndroidRuntime( 1785): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 1785): at com.android.launcher.Launcher.completeAddAppWidget(Launcher.java:657)
E/AndroidRuntime( 1785): at com.android.launcher.Launcher.onActivityResult(Launcher.java:352)
E/AndroidRuntime( 1785): at android.app.Activity.dispatchActivityResult(Activity.java:3595)
E/AndroidRuntime( 1785): at android.app.ActivityThread.deliverResults(ActivityThread.java:3001)
因为对应的Laucher中把对应的widget的ID加入到WorkSpace.java中去。
二。对widgetProvidrer的编写
1.对于WidgetProvider的编写
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
super.onUpdate(context, appWidgetManager, appWidgetIds);
defaultAppWidget(context, appWidgetIds);
context.startService(updateIntent);
}
defaultAppWidget的处理主要是获取到当前的RemoteViews 然后对其中的button 等设置监听
监听的设置 一般是用pendingIntent.因为RemoteViews只支持setOnClickPendingIntent(id,pendingIntent);
而pendIntent的获取一般有2种方法一种是PendingIntent.getActivity();就是跳到对应的Activity去处理你的事假。
pendingIntent = PendingIntent.getActivity(context,
0 /* no requestCode */, intent, 0 /* no flags */);
views.setOnClickPendingIntent(R.id.ivCover, pendingIntent);
第二种是通过调用servers来处理
pendingIntent = PendingIntent.getService(context,
0 /* no requestCode */, intent, 0 /* no flags */);
views.setOnClickPendingIntent(R.id.btnNext, pendingIntent);
三。对server的编写
onCreate一般是第一次调用的时候实例化一些东西
一般在onStart()中对你传过来的action进行处理
对应的servers处理完之后,调用WidgetProvider中的更新UI的code就ok了
参考文献:
Music的widget
Search的widget
有兴趣朋友可以直接去查看下源码!
随着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通讯类。