天天看點

Android特色開發之桌面元件

本文節選于機械工業出版社推出的《Android應用開發揭秘》一書,作者為楊豐盛。本書内容全面,詳細講解了Android架構、Android元件、使用者界面開發、遊戲開發、資料存儲、多媒體開發和網絡開發等基礎知識,而且還深入闡述了傳感器、語音識别、桌面元件開發、Android遊戲引擎設計、Android應用優化、OpenGL等進階知識。另外,本書還全面介紹了如何利用原生的C/C++(NDK)和Python、Lua等腳本語言(Android Scripting Environment)來開發Android應用,并以疊代的方式重制了各種常用的Android應用和經典Android遊戲的開發全過程。

Android特色開發之桌面元件

9.4  桌面元件

第一次啟動Android模拟器時,可以看到在桌面上有很多圖示,如圖9-18所示的Google搜尋框、時鐘、聯系人、浏覽器等,點選這些圖示,系統就會執行相應的程式,與PC作業系統桌面上的快捷方式很像,但是它不完全是快捷方式,還包括了實時檔案夾(Live Folder)和桌面插件(Widget),這樣既美觀又友善使用者操作。本節将學習這每一種桌面元件的開發,讓我們自己的應用程式也能輕松地放置到桌面上。

Android特色開發之桌面元件

圖9-18 Android桌面元件

9.4.1  快捷方式

首先我們學習最基本的桌面元件快捷方式,它和PC上的快捷方式一樣,用于啟動某一應用程式的某個元件(如Activity、Service等)。其實要在桌面上添加一個快捷方式很簡單,隻需要長按桌面或者點選“Menu”按鍵(如圖9-19所示),就可以彈出添加桌面元件的選項,如圖9-20所示,“Shortcuts”為添加快捷方式,“Widgets”為Widget開發的桌面插件,“Folders”為實時檔案夾,進入相應的選項後即可添加相應的桌面元件。

Android特色開發之桌面元件

圖9-19  Menu菜單 圖9-20  添加桌面元件

本小節重點介紹在應用程式中通過代碼來将一個應用程式添加到圖9-20的Shortcuts清單中,這裡添加一個發送郵件的應用到快捷方式清單上去(參見本書所附代碼:第9章\Examples_09_05)。

首先需要在Activity注冊時添加一個Action為android.intent.action.CREATE_SHORTCUT的IntentFilter,如代碼清單9-7所示,添加之後清單中就會出現該應用的圖示和名字了。

代碼清單9-7  第9章\Examples_09_05\AndroidManifest.xml

接下來還要為快捷方式設定名字、圖示、事件等屬性。Intent.EXTRA_SHORTCUT_NAME對應快捷方式的名字;Intent.EXTRA_SHORTCUT_ICON_RESOURCE對應快捷方式的圖示;Intent. EXTRA_SHORTCUT_INTENT對應快捷方式執行的事件。需要說明的是,Android專門提供了Intent.ShortcutIconResource.fromContext來建立快捷方式的圖示,最後通過setResult來傳回,建構一個快捷方式,如代碼清單9-8所示。

代碼清單9-8  第9章\Examples_09_05\src\com\yarin\android\Examples_09_05\Activity01.java

現在我們啟動模拟器,就可以在Shortcuts清單中找到所添加的快捷方式,将其添加到桌面,如圖9-21所示。

Android特色開發之桌面元件

圖9-21  桌面快捷方式

9.4.2  實時檔案夾

在Android 1.5中,Live Folders無疑是一個備受關注的新功能。簡單地說,Live Folders就是一個檢視你的手機中所有電子書、電子郵件、rss訂閱、播放清單的快捷方式,并且這些内容是實時更新的。比如你不再需要單獨打開電子郵件軟體檢視郵件,打開通訊錄找聯系人等。Live Folders自帶了列出所有聯系人、所有有電話号碼的聯系人以及Starred聯系人的功能,我們還可以使用Live Folders API開發出更多的新穎應用。

由于Live Folders本身不存儲任何資訊,都是以映射的方式檢視其ContentProvider所指向的資料資訊,并可以自定義顯示格式,是以當源資料發生改變後,Live Folders可以實時更新顯示内容。那麼在開發時,我們要確定所指定資料資訊URI的ContentProvider支援實時檔案夾的查詢。

其添加方式和添加快捷方式一樣,隻是在選擇時要選擇“Folders”。本小節我們通過Live Folders調用電話本中的資訊,當點選其中一條資訊時,便執行呼叫該聯系人的動作(本書所附代碼:第9章\ Examples_09_06)。

和建立快捷方式一樣,我們需要在Activity注冊時添加一個Action動作為android.intent.action. CREATE_LIVE_FOLDER的IntentFilter。代碼如下:

我們需要在程式中設定該實時檔案夾的資料源、圖示、名字的資訊。可以通過intent.setData方法來設定要讀取的資料源,該例中我們設定資料源為“content://contacts/live_folders/people”,即聯系人資訊。其他資訊的設定如表9-2所示。

表9-2  Live Folders的常用屬性

Android特色開發之桌面元件

在設定圖示時,Android專門提供了Intent.ShortcutIconResource.fromContext來設定實時檔案夾的圖示。下面我們将實時檔案夾添加到桌面(如圖9-22所示),運作效果如圖9-23所示。

Android特色開發之桌面元件

圖9-22 “電話本”實時檔案夾

圖9-23  實時檔案夾運作效果

下面需要在onCreate方法中将實時檔案夾的相關資訊裝入Intent對象,并通過setResult方法設定為結果Intent,最後調用finish方法結束Activity,把結果傳回給Home應用程式,以添加實時檔案夾,如代碼清單9-9所示。

代碼清單9-9  第9章\Examples_09_06\src\com\yarin\android\Examples_09_06\Activity01.java

9.4.3  Widget開發

Widget是一種很小的應用程式,主要作為Web 2.0服務或網際網路内容的前端。Web設計人員與開發者可以使用Widget來創造最受歡迎的網際網路體驗。在Android 1.5中加入了AppWidget framework架構,開發者可以使用該架構開發Widget,這些Widget可以拖到使用者的桌面并且可以互動。Widget可以提供一個full-featured apps的預覽,例如可以顯示即将到來的月曆事件,或者一首背景播放的歌曲的詳細資訊。當Widget被拖到桌面上時,指定一個保留的空間來顯示應用提供的自定義内容。使用者可以通過這個Widget來和應用互動,例如暫停或切換歌曲。如果你有一個背景服務,可以按照你自己的Schedule更新你的Widget,或者使用AppWidget framework提供一個自動的更新機制。

每個Widget就是一個BroadcastReceiver,它們用XML metadata來描述Widget的細節。AppWidget framework通過Broadcast intents和Widget通信, Widget的更新使用RemoteViews來發送。RemoteViews被包裝成一個layout和特定内容來顯示到桌面上。下面我們通過一個示例來學習Widget開發(本書所附代碼:第9章\Examples_09_07)。

首先需要在res\layout目錄下建立桌面元件的布局檔案appwidget_provider.xml,用來顯示桌面布局,這裡我們建立一個TextView用來顯示一段文字,如代碼清單9-10所示。

代碼清單9-10  第9章\Examples_09_07\res\layout\appwidget_provider.xml

然後需要建立一個描述這個桌面元件屬性的檔案,存放到res\xml檔案夾下,如代碼清單9-11所示。

代碼清單9-11  第9章\Examples_09_07\res\xmlappwidget_provider.xml

其中android:minWidth和android:minHeight分别指定了桌面元件的最小寬度和最小高度,其值可以根據期望的單元格數量并使用前面介紹過的公式來計算(最小尺寸=(單元格數×74)?2),android:updatePeriodMillis是自動更新的時間間隔,android:initialLayout是Widget的界面描述檔案。Android:configure是可選的,如果你的Widget需要在啟動前先啟動一個Activity,則需要設定該項為你的Activity。這裡我們需要先輸入一段文字,然後顯示在Widget上。

然後要建立一個Widget,建立一個類,讓其繼承類AppWidgetProvider。在AppWidgetProvider中有許多方法,包括onUpdate(周期更新時調用)、onDeleted(删除元件時調用)、onEnabled(當第一個元件建立時調用)、onDisabled(當最後一個元件删除時調用),如代碼清單9-12所示。

代碼清單9-12  第9章\Examples_09_07\src\com\yarin\android\Examples_09_07\ExampleAppWidget- Provider.java

其中,在updateAppWidget方法中我們建構了一個RemoteViews對象來對桌面元件進行更新,通過setTextViewText方法來更新一個文本的顯示,然後通過updateAppWidget方法來将更新提供給AppWidget使其更新到桌面。在onDisabled和onEnabled方法中我們用ComponentName來表示應用程式中某個元件的完整名字。

最後,建立一個BroadcastReceiver類來接收更新的資訊,在收到更新的資訊之後就更新這個桌面Widget元件,如代碼清單9-13所示。

代碼清單9-13  第9章\Examples_09_07\src\com\yarin\android\Examples_09_07\ExampleBroadcast- Receiver.java

接下來,處理Android:configure指定的類,用來輸入資訊,在該類中我們監聽這個按鈕,當點選按鈕之後,建立一個AppWidgetManager執行個體,然後調用ExampleAppWidgetProvider.updateAppWidget方法來更新這個Widget,通過以下代碼可以取得一個AppWidgetManager執行個體:

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

注意,還需要在AndroidManifest.xml中注冊AppWidget、BroadcastReceiver和用來輸入資訊的Activity,如代碼清單9-14所示。

代碼清單9-14  第9章\Examples_09_07\AndroidManifest.xml

下面将該Widget添加到桌面上,和添加快捷方式一樣,如圖9-24所示,然後輸入要顯示的文字,如圖9-25所示,點選“确定”按鈕之後,桌面即顯示我們輸入的資訊,如圖9-26所示。