隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          實現一個用于顯示當前時間的Google Android 窗口小部件(AppWidget)

          本文為原創,如需轉載,請注明作者和出處,謝謝!

              Android不用我多說了,這是Google在2007年推出的一款主要用于移動設備的操作系統。google在android sdk1.5中加入了appwidget api。通過這項技術,可以在android手機的主界面(Home界面)顯示可以拖動的窗口,用于顯示各種用戶需要的信息。至于顯示什么,就完全依靠開發人員的想象力了。OK,廢話少說。我們先來體驗一下如何開發一個顯示當前時間的appwidget。這個appwidget每秒刷新一次,顯示時、分和秒。這個appwidget的效果如圖1所示。
          圖1

              圖1上方“當前時間:03:34:34”就是我們要實現的appwidget。這個appwidget是可以拖動的。如果在真機或android模擬器中這個時間是變化的。
              我們可按如下四步來實現這個appwidget:

          步驟1:實現appwidget的layout

              在android上編程的人都知道,android的界面離不開layout,appwidget也不例外。建立appwidget layout的方式與建立其他layout的方式相同。在res\layout目錄中建立一個firstappwidget.xml文件,代碼如下:

          <?xml version="1.0" encoding="utf-8"?>
          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation
          ="vertical" android:layout_width="fill_parent"
              android:layout_height
          ="fill_parent">
              
          <TextView android:id="@+id/tvMsg" android:layout_width="fill_parent"
                  android:layout_height
          ="wrap_content" android:textSize="20dp" 
                  android:textColor
          ="#F00" />
          </LinearLayout>
              tvMsg用于顯示applwidget中的文字,也就是類似“當前時間:03:34:34”的字符串。

          步驟2:編寫AppWidgetProvider類

              appwidget需要一個AppWidgetProvider類的子類,該類的代碼如下:
          package net.blogjava.nokiaguy.appwidget;

          import java.util.Date;
          import android.appwidget.AppWidgetManager;
          import android.appwidget.AppWidgetProvider;
          import android.content.Context;
          import android.widget.RemoteViews;

          public class MyAppWidgetProvider extends AppWidgetProvider
          {
              
          public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                      
          int[] appWidgetIds)
              {
                  
          final int N = appWidgetIds.length;
                  
          for (int i = 0; i < N; i++)
                  {
                      
          int appWidgetId = appWidgetIds[i];
                      RemoteViews views 
          = new RemoteViews(context.getPackageName(),
                              R.layout.firstappwidget);    
                      java.text.DateFormat df 
          = new java.text.SimpleDateFormat("hh:mm:ss");
                      views.setTextViewText(R.id.tvMsg, 
          "當前時間:" + df.format(new Date()));            
                      appWidgetManager.updateAppWidget(appWidgetId, views);
                  }        
              }
          }

              當創建每一個appwidget的實例時AppWidgetManager都會調用該appwidget的onUpdate方法。要想使更新有效,必須調用updateAppWidget方法更新相應的appwidget中的view。

          步驟3:配置<appwidget-provider>元素
              appwidget還需要一個<appwidget-provider>元素來描述appwidget的大小、布局、更新頻率等信息。在res目錄下建立一個xml目錄,在res\xml目錄下建立一個appwidget_provider.xml,并輸入如下的代碼:
          <?xml version="1.0" encoding="utf-8"?>

          <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
              android:minWidth
          ="200dp"
              android:minHeight
          ="30dp"
              android:updatePeriodMillis
          ="1000"
              android:initialLayout
          ="@layout/firstappwidget"/>

              其中android:minWidth和android:minHeight表示appwidget的最小寬度和高度,android:updatePeriodMillis表示更新頻率,單位是毫秒。也就是說,AppWidgetManager每秒都會調用該appwidget的onUpdate方法。因此,onUpdate方法在兩種情況下被調用,第一種是添加appwidget時,第二種是每一個更新周期結束時調用一次onUpdate方法。

          步驟4:進行最后的配置

              appwidget需要在appwidget_provider.xml文件中配置receiver,從這一點可以看出,android是通過Broadcast來通知每一個appwidget的。appwidget_provider.xml文件的配置代碼如下:
          <?xml version="1.0" encoding="utf-8"?>
          <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package
          ="net.blogjava.nokiaguy.appwidget" android:versionCode="1" android:versionName="1.0">
              
          <application android:icon="@drawable/icon" android:label="@string/app_name">
                  
          <receiver android:name=".MyAppWidgetProvider">
                      
          <meta-data android:name="android.appwidget.provider"
                              android:resource
          ="@xml/appwidget_provider" />
                      
          <intent-filter>
                          
          <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                      
          </intent-filter>
                  
          </receiver>
              
          </application>
              
          <uses-sdk android:minSdkVersion="3" />
          </manifest>

              在上面的配置代碼中使用<intent-filter>元素的<action>子元素來指定appwidget接收的動作。使用<meta-data>元素指定appwidget的layout。

              將這個程序安裝在android模擬器中,我們會發現appwidget并沒有出現。實際上,appwidget需要手工去添加。通過模擬器的menu,進入“添加”列表,選擇“widgets”,我們就會找到本文實現的appwidget,名稱為“顯示當前時間”。如圖2所示。
          圖2
              當然,只要Home頁有地方,我們也可以添加多個appwidget,如圖3所示。
          圖3





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-07-22 16:05 銀河使者 閱讀(2743) 評論(2)  編輯  收藏 所屬分類: java 原創移動(mobile)

          評論

          # re: 實現一個用于顯示當前時間的Google Android 窗口小部件(AppWidget)  回復  更多評論   

          不錯。。。
          2009-07-23 14:20 | subtitle

          # re: 實現一個用于顯示當前時間的Google Android 窗口小部件(AppWidget)  回復  更多評論   

          Note: Updates requested with updatePeriodMillis will not be delivered more than once every 30 minutes.
          2012-07-03 00:08 | yxx
          主站蜘蛛池模板: 思茅市| 藁城市| 阿拉善左旗| 烟台市| 米泉市| 华蓥市| 富民县| 安仁县| 嘉义县| 陇川县| 吴旗县| 沁阳市| 曲阳县| 西充县| 上栗县| 邮箱| 远安县| 金湖县| 城市| 蒙阴县| 台东市| 万盛区| 峨边| 土默特左旗| 自贡市| 聂拉木县| 徐州市| 三亚市| 乐至县| 旬邑县| 白水县| 呼图壁县| 东城区| 白沙| 盈江县| 汤阴县| 清丰县| 东乌珠穆沁旗| 伊金霍洛旗| 四平市| 阳西县|