歡迎使用我的 在線工具

          小D

          讀歷史、看小說、寫程序都是我所愛。技術不好,頭腦不靈光,靠的是興趣。
          隨筆 - 35, 文章 - 25, 評論 - 13, 引用 - 0
          數據加載中……

          Android的Widget

                Android的AppWidget的概念不好理解啊,我也不知道理解得對不對,先記在這里,以免以后又忘記了。
                (1) 建立一個Android工程,用eclispse吧,下一步,下一步的就不多說了。
                (2) 在res/xml目錄下面建立一個xml文件。命名隨便吧。寫下如下內容
                     
          1<?xml version="1.0" encoding="utf-8"?>
          2<appwidget-provider
          3  xmlns:android="http://schemas.android.com/apk/res/android"
          4  android:initialLayout="@layout/widget_layout_small"
          5  android:minWidth="72dip" android:minHeight="72dip" android:updatePeriodMillis="3600000">
          6</appwidget-provider>
                   這里是定義一個appwidget-provider,Android系統從這里認為該程序是一個widget程序。android:initialLayout指定布局文件,也就是在res/layout目錄下的那些個xml文件;android:updatePeriodMillis知道更新周期,單位為毫秒;還有一個android:configure,這個是可選的,如果你的widget事先要啟動一個Activity,就需要在這里指定一個Activity,顯然我們這里不需要。他就是一個AppWidgetProviderInfo類的描述信息。
               (3) 寫布局文件,這個就不多說了。
               (4) appwidget-provider,定義一個類,從AppWidgetProvider類繼承,他實際是一個BroadcastReceiver,系統使用它和Widget界面進行交互。
                   
           1package cn.vaga.today;
           2
           3import java.util.Calendar;
           4
           5import android.app.PendingIntent;
           6import android.appwidget.AppWidgetManager;
           7import android.appwidget.AppWidgetProvider;
           8import android.content.ComponentName;
           9import android.content.Context;
          10import android.content.Intent;
          11import android.graphics.Canvas;
          12import android.text.format.Time;
          13import android.widget.RemoteViews;
          14
          15public class TodayDateSmall extends AppWidgetProvider
          16{
          17    // 當這個AppWidget提供者 被要求提供RemoteViews一系列的AppWidgets,這個方法作為ACTION_APPWIDGET_UPDATE
          18    // 廣播回復時被調用
          19    // 每次更新AppWidget時候調用
          20       @Override
          21       public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
          22           // 得到更新后的RemoteViews
          23          RemoteViews updateView = buildUpdate(context);
          24          //更新Widget的RemoteViews
          25          appWidgetManager.updateAppWidget(appWidgetIds, updateView);
          26          super.onUpdate(context, appWidgetManager, appWidgetIds);
          27       }

          28       
          29       private String[] months = {"一月""二月""三月""四月",
          30               "五月""六月""七月""八月",
          31               "九月""十月""十一月""十二月"}
          ;
          32       
          33       
          34       private RemoteViews buildUpdate(Context context) {
          35          RemoteViews updateView = null;
          36          // 這個Time更快
          37         // Time time = new Time();
          38          // 現在
          39          //time.setToNow();
          40          Calendar cal = Calendar.getInstance();
          41          String month = months[cal.get(Calendar.MONTH)];
          42          // 得到RemoteViews
          43          updateView = new RemoteViews(context.getPackageName(), R.layout.widget_layout_small);
          44          // 設置View的內容
          45          // 日期
          46          updateView.setTextViewText(R.id.Date, String.valueOf(cal.get(Calendar.DATE)));
          47          // 月
          48          updateView.setTextViewText(R.id.Month, month);
          49          Lunar lunar = new Lunar(cal);
          50          updateView.setTextViewText(R.id.Lunar,lunar.toString());
          51          // OK,這個一個運行用的Intent啦
          52          // 加下面這段應該只是為了讓Widget相應click事件吧
          53          Intent launchIntent = new Intent();
          54          // 設置處理該Intent的組件,這里是android自帶的日期啟動組件
          55          launchIntent.setComponent(new ComponentName("com.android.calendar""com.android.calendar.LaunchActivity"));
          56          // 設置該Itent為主進入點
          57          launchIntent.setAction(Intent.ACTION_MAIN);
          58          launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
          59          launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
          60          // 啟動指定的Intent的Activity
          61          PendingIntent intent = PendingIntent.getActivity(context, 0, launchIntent, 0);
          62          // 監聽點擊事件
          63          updateView.setOnClickPendingIntent(R.id.SmallBase, intent);
          64          return updateView;
          65       }

          66}

          67
          68
               他有四個方法:onDeleted、onEnabled、onDisabled、onUpdate,我們這里只實現了最主要的onUpdate方法,他在周期更新的時候調用。每次調用就用appWidgetManager來更新Widget(生成一個RemoteView)。appWidgetManager是系統生成的用于管理Widget的對象,我們不需要進行管理,它會向AppWidgetProvider發通知,他會更新Widget的UI。

               (5) AndroidManifest.xml 
               
           1<?xml version="1.0" encoding="utf-8"?>
           2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
           3      package="cn.vaga.today"
           4      android:versionCode="1"
           5      android:versionName="1.0">
           6    <application android:icon="@drawable/icon" android:label="@string/app_name_small">
           7        <!-- 訂閱指定的BroadcastReceiver -->
           8        <receiver android:label="@string/app_name_small" android:name=".TodayDateSmall">
           9            <intent-filter>
          10            <!-- 就只處理更新的廣播 -->
          11                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
          12            </intent-filter>
          13            <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_small"></meta-data>
          14        </receiver>
          15    </application>
          16    <uses-sdk android:minSdkVersion="7" />
          17
          18</manifest> 

               在這里注冊AppWidgetRecever指定其處理的Intent的Action為android.appwidget.action.APPWIDGET_UPDATE。當然還要個AppWidgetRecever指定它的描述文件
                      <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_small"></meta-data>,這是很必要的,否則Android也不會知道這個Widget到底是如何定義的了。

          posted on 2011-04-10 23:52 vagasnail 閱讀(1544) 評論(0)  編輯  收藏 所屬分類: Android

          主站蜘蛛池模板: 渝北区| 新疆| 瓦房店市| 资源县| 洛浦县| 望谟县| 田阳县| 苍溪县| 兰西县| 南漳县| 贺州市| 库车县| 蛟河市| 犍为县| 吴堡县| 达尔| 庄河市| 洮南市| 富川| 萨嘎县| 通江县| 灵台县| 贵定县| 台山市| 永城市| 芜湖县| 台中市| 庆城县| 宝清县| 栾城县| 观塘区| 商丘市| 华亭县| 分宜县| 民丰县| 鄂尔多斯市| 中阳县| 赤峰市| 嘉鱼县| 昌宁县| 綦江县|