android:AppWidget 視窗小組件的開發思想和Demo

來源:互聯網
上載者:User

AppWidget 視窗小組件的開發思想和Demo

  這篇文章講一下android系統“視窗小組件”(也叫做,主畫面組件)的開發過程。什麼叫視窗小組件呢?

是指在主畫面上顯示的獨立視圖(不過填充了資料)。這些視圖的資料內容由後台進程頂起更新。要用到RemoteViews來

顯示組件,還要指派廣播接收器更新這些RemoteViews. 既可以單獨做個視窗小組件,也可在App中嵌入多個視窗小組件。

如<圖一>就是人人網用戶端帶個一個小組件和Google play的小組件。

 

<圖一>

  接下來就以"生日提醒通知"的例子簡述下小組件的開發思想。

  一:首先需要聲明一個appwidget-provider控制項

    在res→xml裡定義一個檔案AppWidgetProviderInfo.xml檔案。

<?xml version="1.0" encoding="utf-8"?><appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"    android:minWidth="150dp" //寬(這個有講究,文章最後有注釋*)    android:minHeight="120dp" //長    android:updatePeriodMillis="86400000" //更新頻率 ms為單位    android:initialLayout="@layout/bday_widget" //布局檔案    android:configure="com.carman.birthdayremind.ConfigureBDayWidgetActivity" > //配置活動(可選)    </appwidget-provider>
android:initialLayout這個屬性就是你所要顯示的介面,根據自己的需求來設計。

  二:AppWidgetProvider 類的實現

    要實現視窗小組件的開發,必須繼承AppWidgetProvider 的子類。實現定義基本方法以允許你編程來和App Widget串連,這基於廣播    事件。通過它,當這個App Widget被更新,啟用,禁用和刪除的時候,你都將接收到廣播通知。

    如下:BDayWidgetProvider.class

public class BDayWidgetProvider extends AppWidgetProvider {        @Override    public void onDeleted(Context context, int[] appWidgetIds) {        // TODO Auto-generated method stub        //當App Widget的執行個體從宿主中刪除時被調用。    }    @Override    public void onDisabled(Context context) {        當你的App Widget的最後一個執行個體被從宿主中刪除時被調用。因為:譬如中的人人網小組件,你可添加N個執行個體。    }    @Override    public void onEnabled(Context context) {        // 當一個App Widget執行個體第一次建立時被調用。    }    @Override    public void onUpdate(Context context, AppWidgetManager appWidgetManager,            int[] appWidgetIds) {        //這個方法調用來間隔性的更新App Widget,間隔時間用AppWidgetProviderInfo 裡的updatePeriodMillis屬性定義(參見添加AppWidgetProviderInfo中繼資料)。}
    @Override    public void onReceive(Context context, Intent intent) {        //這個接收到每個廣播時都會被調用,而且在上面的回呼函數之前。你通常不需要實現這個方法,因為預設的AppWidgetProvider實現過濾所有Ap     p Widget 廣播並恰當的調用上述方法。    }
 }

  要實現複雜的需求,也不外乎就是擴充上述類中的這幾個方法。這裡只講原理,故不多說哈。

  三:在manifest中註冊並添加廣播。

<receiver android:name=".BDayWidgetProvider" >    <meta-data android:name="android.appwidget.provider"       android:resource="@xml/AppWidgetProviderInfo" />    <intent-filter>       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />    </intent-filter></receiver>

  <intent-filter> 元素必須包括一個含有android:name屬性的<action>元素。該元素指定AppWidgetProvider接受ACTION_APPWIDGET_UPDATE    廣播。這是唯一你必須顯式聲明的廣播。當需要的時候,AppWidgetManager 會自動發送所有其他App Widget廣播給AppWidgetProvider。

 

  *【注釋】:小組件的長寬的定義規則

    預設的App Widgets所在視窗的案頭位置基於有確切高度和寬度的單元網格。如果App Widget的最小長寬和這些網格單元的

  尺寸不匹配,那麼這個App Widget將收縮到最接近的單元尺寸(參見App Widget Design Guidelines 以擷取更多關於案頭單元尺寸的資訊)

  因為案頭布局方向(由此,單元的尺寸)可以變化,按照拇指規則,你應該假設最壞情況單元尺寸是74像素高和寬。不過,你必須

  從最後的尺寸中減去2以把像素計算過程中產生的任何的整數舍入誤差考慮在內。要找到像素密度無關的最小寬度和高度,使用這個公式:
    (number of cells * 74) - 2
  遵循這個公式,你應該使用72dp為每一個單元高度,294dp為四個單元寬度。

 

  已經以上三步就可以製作一個最簡單的小視窗組件了。原理與已清楚了哈,下面說說我自己的BirthdayRemind的功能:

  BirthdayRemind可通過設定檔輸入姓名和日期,用來算某人生日的倒計時。小視窗每日會更新,數字將減1,並且做了一個“Buy”連結,

可用來調用購買生日禮物的連結。運行如<圖二>,感興趣的朋友可下載下來玩玩。

  BirthdayRemind源碼地址:http://pan.baidu.com/share/link?shareid=23016&uk=1442961174

    <圖二>

 

  可以轉載,但請註明出處,謝謝!

  作者:Carman  2012-08-13 15:27:10

  郵箱:carman_loneliness@163.com

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.