android widget 研究

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.