關于Android Widget實例學習教程
關于Android Widget實例學習教程是本文要介紹的內容,主要是來了解并學習Android Widget實例的應用,具體內容的實現來看本文詳解。應用程序窗口小部件(Widget)是微小的應用程序視圖,可以被嵌入到其它應用程序中(比如桌面)并接收周期性的更新。
為了創建一個Widget,需要AppWidgetProviderInfo與AppWidgetProvider。AppWidgetProviderInfo主要為Widget描述metadata,如Widget的布局,更新頻率和AppWidgetProvider類,這在xml里面定義。AppWidgetProvider定義基本的方法允許你基于廣播事件與Widget進行交互。通過它,當Widget更新,可用,不可用或者刪除的時候,你將收到廣播。
下面的截屏顯示本實例的效果圖:

此Widget很簡單,就是以鬧鈴面板為背景,在上面顯示字符串。
由于涉及的文件比較多,先看一下文件存放目錄圖:

注:在res/drawable-ldpi/加入背景資源圖片。可以看到res下面有三個文件夾:drawable-hdpi, drawable-ldpi, drawable-mdpi.三個文件夾分別對應不同的屏幕分辨率。
drawable-hdpi里面存放高分辨率的圖片,如:WVGA (480x800),FWVGA (480x854)
drawable-mdpi里面存放中等分辨率的圖片,如HVGA (320x480)
drawable-ldpi里面存放低分辨率的圖片,如QVGA (240x320)
為了使我們的程序滿足不同分辨率的機型,Android在res下面分別建立不同文件夾,我們可以把不同分辨率機型的圖片放在不同目錄下面。
源代碼如下:
首先,申明AppWidgetProvider類在應用的AndroidManifest.xml文件里 :
- AndroidManifest.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.test"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/clockgoog_dial" android:label="@string/app_name">
- <receiver android:name=".TestWidget"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- </intent-filter>
- <meta-data android:name="android.appwidget.provider"
- android:resource="@xml/widget_provider"
- />
- </receiver>
- </application>
- <uses-sdk android:minSdkVersion="7" />
- </manifest>
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.test"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/clockgoog_dial" android:label="@string/app_name">
- <receiver android:name=".TestWidget"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- </intent-filter>
- <meta-data android:name="android.appwidget.provider"
- android:resource="@xml/widget_provider"
- />
- </receiver>
- </application>
- <uses-sdk android:minSdkVersion="7" />
- </manifest>
注:<receiver>元素需要andriod:name屬性,它指明被Widget使用的AppWidgetProvider.
<intent-filter>元素必須包含帶有android:name屬性的<action>元素。這一屬性指明AppWigetProvider可接收ACTION_APPWIDGET_UPDATE廣播。這是你必須明確聲明的唯一廣播。AppWidgetManager自動發送Widget廣播到AppWidgetProvider。
<meta-data>元素指明AppWidgetProviderInfo資源,需要如下屬性:
android:name-指明元數據名稱。使用android.appwidget.provider把數據指定為對AppWidgetProviderInfo的描述。
android:resource-指明AppWidgetProviderInfo資源的位置。
其次,增加AppWidgetProviderInfor元數據在res/xml/widget_provider.xml中:
- res/xml/widget_provider.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="50dip"
- android:minHeight="50dip"
- android:updatePeriodMillis="10000"
- android:initialLayout="@layout/main"/>
- <?xml version="1.0" encoding="utf-8"?>
- <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="50dip"
- android:minHeight="50dip"
- android:updatePeriodMillis="10000"
- android:initialLayout="@layout/main"/>
注:AppWidgetProviderInfo定義基本的Widget屬性,如最小布局維數,初始的布局資源,更新Widget頻率和在創建時間啟動Activity的配置。在XML資源里使用單一的<appwidget-provider>元素定義AppWidgetProviderInfo對象并且把它保存在工程的res/xml/文件夾下。
然后,創建Widget布局文件在res/layout/main.xml中:
- res/layout/main.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"
- android:background="@drawable/clockgoog_dial">
- <TextView
- android:id="@+id/textview"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- android:textSize="10px"
- android:textColor="#ff0000"/>
- </LinearLayout>
- <?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"
- android:background="@drawable/clockgoog_dial">
- <TextView
- android:id="@+id/textview"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- android:textSize="10px"
- android:textColor="#ff0000"/>
- </LinearLayout>
注:你必須在XML里為你的Widget定義一個初始的布局文件,然后保存在工程的res/layout/目錄下。如果你熟悉在XML中聲明布局,那么創建Widget布局是簡單的。你可以使用View對象設計你的Widget,然而你必須注意Widget基于RemoteViews,它并不支持布局或者view控件中的每一種。
***,使用AppWidgetProvider類在TestWidget.java中:
- package com.android.test;
- import android.appwidget.AppWidgetManager;
- import android.appwidget.AppWidgetProvider;
- import android.content.Context;
- public class TestWidget extends AppWidgetProvider {
- /** Called when the activity is first created. */
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,
- int[] appWidgetIds) {
- super.onUpdate(context, appWidgetManager, appWidgetIds);
- }
- }
- package com.android.test;
- import android.appwidget.AppWidgetManager;
- import android.appwidget.AppWidgetProvider;
- import android.content.Context;
- public class TestWidget extends AppWidgetProvider {
- /** Called when the activity is first created. */
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,
- int[] appWidgetIds) {
- super.onUpdate(context, appWidgetManager, appWidgetIds);
- }
- }
注:繼承于BroadcastReceiver的AppWidgetProvider類是一種很方便處理Widget廣播的類。AppWidgetProvider只接收與Widget相關的事件廣播,如當Widget更新,刪除,可用和不可用的時候。當這些廣播事件發生的時候,AppWidgetProvider收到如下的方法調用:onUpdated,onDeleted,onEnabled,onDisabled,onReceive。
最重要的AppWidgetProvider回調函數是onUpdated,因為當每一個Widget增加的時候它都會被調用(除非你使用配置Activity)。如果你的Widget接收任意用戶交互事件,那么你需要在回調函數中注冊事件handler。如果你的Widget沒有創建臨時文件或者數據庫,或者執行需要clean-up的工作,那么onUpdated可能是你需要注冊的唯一回調函數。
小結:關于Android Widget實例學習教程的內容介紹完了,希望通過Android Widget實例內容的學習能對你有所幫助。