解析Android Widget设计与开发(1)
Android Widget设计与开发是本文要介绍的内容,最早Widget是指在PC的桌面上的小窗口程序;Web上的先行者似乎是Yahoo!;当然,OPhone也搞了一套Widget,HTML+CSS的东东。
我们这里谈的所谓Widget,就是窗口小部件,Android SDK从1.5版本开始支持AppWidget framework,返个框架允许开发者开发Widgets,这些Widgets可以被用户通过长按桌面进行添加,与应用程序进行数据交互。
需求:
在桌面上开发一个Widget,可以实时显示IM软件的状态更新变化;可以通过左右按钮,查看上次或下调更新内容。
(参考效果图)
设计思路:
(参考设计序列图)
代码:
Java:
- /src/org.anymobile.demo.Globals \\Intent.action 声明
- /src/org.anymobile.demo.service.UpdateService extends Service \\同步、更新Widget布局数据的Service
- /src/org.anymobile.demo.widget.UpdateAppWidgetProvider extends AppWidgetProvider \\Widget,接收器
XML:
- /res/layout/update_appwidget.xml \\布局设计
- /res/values/strings.xml \\常量声明
- /res/xml/update_appwidget_info.xml \\app widget定义
- AndroidManifest.xml
#AndroidManifest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="org.anymobile.demo"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <receiver android:name=".widget.UpdateAppWidgetProvider"
- android:label="@string/app_widget_label" >
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- </intent-filter>
- <meta-data android:name="android.appwidget.provider"
- android:resource="@xml/update_appwidget_info" />
- </receiver>
- <service android:name=".service.UpdateService" android:label="@string/app_name">
- <intent-filter>
- <action android:name="org.anymobile.demo.service.IMM_UPDATE_SERVICE" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </service>
- </application>
- </manifest>
#strings.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">AnymobileDemo</string>
- <string name="app_widget_label">AnymobileDemo Widget</string>
- <string name="app_widget_title">Updates</string>
- <string name="app_widget_error_message">No messages, please check to login.</string>
- </resources>
#update_appwidget_info.xml
- <?xml version="1.0" encoding="utf-8"?>
- <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="294dip"
- android:minHeight="120dip"
- android:updatePeriodMillis="0"
- android:initialLayout="@layout/update_appwidget">
- </appwidget-provider>
#update_appwidget.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">
- <LinearLayout
- android:id="@+id/app_widget_top"
- android:gravity="center_vertical"
- android:orientation="horizontal"
- android:background="@drawable/widget_titlebar"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- </LinearLayout>
- <LinearLayout
- android:id="@+id/app_widget_body"
- android:orientation="horizontal"
- android:background="@drawable/widget_body"
- android:layout_width="fill_parent"
- android:layout_height="100dip">
- <LinearLayout
- android:id="@+id/app_widget_message"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextView
- android:id="@+id/widget_message"
- android:text="@string/app_widget_error_message"
- android:paddingRight="5dip"
- android:paddingLeft="5dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </TextView>
- </LinearLayout>
- </LinearLayout>
- <LinearLayout
- android:id="@+id/app_widget_bottom"
- android:gravity="right"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- </LinearLayout>
- </LinearLayout>
#Globals.java
package org.anymobile.demo;
- public final class Globals
- {
- public static final String ACTION_APP_WIDGET_SERVICE= "org.anymobile.demo.service.IMM_UPDATE_SERVICE";
- public static final String ACTION_APP_WIDGET_PREV = "org.anymobile.demo.intent.action.APP_WIDGET_PREV";
- public static final String ACTION_APP_WIDGET_NEXT = "org.anymobile.demo.intent.action.APP_WIDGET_NEXT";
- public static final String ACTION_APP_WIDGET_RELOAD = "org.anymobile.demo.intent.action.APP_WIDGET_RELOAD"; }