android:AppWidget 窗口小部件的開發思想和Demo


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM