之前的一些配置如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通訊類。