何浩,李滔
(西北工業大學 電子信息學院,陜西 西安 710129)
經過多年的發展,第三代數字通信(3G)技術獲得了廣泛的接受,它為移動終端用戶帶來了更快的數據傳輸速率。現在移動終端已不再僅是通訊網絡的終端,還將成為互聯網的終端。因此,移動終端的應用軟件和需要的服務將會有很大的發展空間。Google為此于2007年11月推出了一個專為移動設備設計的軟件平臺——Android。
Android是一套真正意義上的開放性移動設備綜合平臺,它包括操作系統、中間件和一些關鍵的平臺應用。Android最大特點在于它是一個開放的體系架構,具有非常好的開發和調試環境,而且還支持各種可擴展的用戶體驗,Android里面具有非常豐富的圖形系統,對多媒體的支持功能和非常強大的瀏覽器[1-3]。2011年第一季度,Android在全球的市場份額首次超過塞班系統,躍居全球第一。 2012年11月數據,Android占據全球智能手機操作系統市場76%的份額,中國市場占有率為90%。
伴隨著Android用戶的迅猛增長,手機應用創新進入了“爆發期”,Android電子市場能夠持續保持強勁增長速度已經創造了新的奇跡,應用程序和游戲數量的增長速度已經超出了預期。官方最近給出的數字顯示,2012年1月,Android電子市場中的活躍應用已超過40萬,這距離突破30萬應用僅僅用了4個月時間。
然而,Android應用的開發開始時只支持Java語言,現在幾乎所有的應用都是使用Java語言開發的,但是對于Android應用開發的愛好者來說,這并不是個好消息,因為并不是所有人都喜歡或者熟悉Java。而且雖然Java在開發Android應用發面的確功能強大,但是也正因如此,它在完成某些簡單任務時顯得過于繁冗復雜,不夠靈巧。Google及時的認識到這對Android發展的不利。于是發起了SL4A(Scripting Layer for Android)項目,它的目標就是可以用各種腳本語言開發 android程序,目前支持 Python、Beanshell、JRuby、Lua、Perl、PHP 和 Rhino等。 有了 SL4A 的支持,我們就可以用Python來開發Android應用了。
Python是一種開放源代碼的腳本編程語言,這種腳本語言特別強調開發速度和代碼的清晰程度。它可以用來開發各種程序,從簡單的腳本任務到復雜的、面向對象的應用程序都有大顯身手的地方。Python還被當作一種入門程序員最適合掌握的優秀語言,因為它免費、面向對象、擴展性強同時執行嚴格的編碼標準[4-6]。
SL4A的全稱為Scripting Layer for Android,它實現了本地腳本和原生態Android程序的內部消息通信,所以任何本地腳本語言,只要實現了這套兼容的JSON RPC通信接口,就可以呼叫SL4A的RPC Server端程序[7]。

圖1 SL4A總體架構Fig.1 General framework
從圖1可以看出,SL4A總體包括Client和Server兩部分來實現通信和整體架構的獨立性,Client端負責解析本地腳本,這樣只要本地腳本實現了兼容的接口,就可以方便實現腳本語言的擴展,而Server端則封裝了Android原生態程序的設計,即使在Android底層API發生變化的時候,Client端也基本不會受到影響,Client把腳本中解析出來的函數調用通過RPC通信,遠程呼叫Server端代理接口,然后由Server調用原生態的Android API(Android Facade架構)來完成具體的功能,在調用結束后,Server端將執行結果反饋給Client端。這樣就實現了用Python對Android應用的開發。
我們可以直接在Android官網上下載到全套的應用開發包,下載地址為 http://developer.android.com/sdk/index.html,其中包括必要的 Android SDK組件和已安裝好ADT(Android Developer Tools)插件的Eclipse IDE。Eclipse是著名的跨平臺的自由集成開發環境。最初主要用來Java語言開發,但通過安裝相應的插件也可使其作為C++、Python、PHP等其他語言的開發工具。Eclipse的本身只是一個框架平臺,但是眾多插件的支持,使得Eclipse擁有較佳的靈活性。許多軟件開發商以Eclipse為框架開發自己的IDE。
為了能在Eclipse中用Python語言做Android應用的開發,除了安裝ADT插件外還需要Pydev插件。在Eclipse中安裝Pydev插件時,點擊菜單欄中的幫助按鈕,在打開的下拉式菜單中選擇Install New Software選項。此時會彈出一個新的對話框,點擊Add按鈕,然后在新對話框中的Name欄輸入插件的名字,在Location欄輸入插件的下載地址,Eclipse的Pydev在線下載安裝地址為:http://Pydev.org/updates,完成后點擊OK,選擇所要安裝的插件包,點擊Next,等待下載安裝完成。當安裝完成后,Eclipse需要重新啟動。重啟之后,就可以在Eclipse中用Python做Android應用開發了。
GUI(Graphical User Interface)即圖形用戶接口,是人機交互最基本的工具,任何一款手機應用或是電腦軟件都無法擺脫GUI的開發。在使用Python的探索開發過程中,我們發現有兩種最基本的方式通過SL4A實現與用戶的交互。第一種方法,直接調用Android API來生成對話框,如警告對話框。這是最簡單、最直接的向用戶傳遞信息并接受用戶反饋的方法。第二種方法是使用HTML或者JavaScript來建立用戶界面(UI),Python在后臺做其他處理。
3.1.1 對話框
SL4A中包含一個UI facade用來訪問Android API中可調用的基本對話框。通過代碼來調用這些對話框非常的簡單。我們所需做的只是設置我們所想顯示的按鈕,項目和題目的內容,然后調用ShowDialog就行了。同時,我們可以通過調用dialogGetResponse來查看用戶的行為。
如果我們想給用戶顯示一條簡短的消息,可以使用makeToast API功能,程序運行后,會顯示如圖2所示的對話框。 它有一個標題 (Hello! ), 有一段提示 (What is your name?),并且getInput方法會提供一個默認的單行輸入欄和一個OK按鈕。

圖2 帶標題、提示行、輸入框和OK按鈕的對話框Fig.2 Input dialog box with title, prompt, input box, and Ok button
當用戶輸入名字并點擊OK后,getInput功能將返回一個元組格式的result對象。在這個例子中,返回的內容為:Result(id=0, result=u’Kentucky Rose’, error=None)
每個result都有一個唯一的ID使其可被追蹤,在這個例子中ID為0。元組的第二個元素就是用戶在輸入欄所輸入的文本內容。每個元組同時還包含一個error元素,用來將可能遇到的各種錯誤信息反饋給調用者。在這個例子中,我們看到error=None,也就是說沒有錯誤。當OK鍵按下后我們就可以看到會彈出一個對話框顯示用戶所輸入的內容,該對話框會持續一小段時間后自動消失。
3.1.2 選項菜單
大部分Android應用都有一個選擇菜單,可以讓用戶設定一些參數或者應用功能的其他選擇。SL4A通過調用addOptionsMenuItem來實現選擇菜單項的創建,包括選擇菜單按鈕的創建,按鈕名稱的定義,按鈕圖標的選擇等。調出菜單項的時候必須有一個系統界面,我們可以調用webViewShow方便的建立一個空白的系統界面。運行程序后按下設備的菜單鍵就會彈出如圖3所示的菜單項。

圖3 菜單項實例Fig.3 Example options menu
當按下Sensible后會得到以下result:
{u ‘data’:u ‘I bet.’, u ‘name’:u ‘sensible’, u‘time’:1301074971174000L}
需注意這個result事實上是一個event的輸出,它包含了3個已命名項,分別為:data、name和time。接下來需要做的就是完成用戶按下每一個菜單選項后所實現的具體功能了。
3.1.3 通過dialogCreateAlert實現文件列表
在Android應用中,我們經常會需要給用戶一個文件列表,比如在閱讀器中添加本地圖書,或者管理本設備SD卡中的文件的時候。SL4A為我們提供了dialogCreateAlert的方法,可以輕松實現這個界面,運行程序后所出現的界面如圖4所示,界面的頂部標題中顯示的是用戶所打開文件夾的路徑。

圖4 簡單的文件選擇對話框Fig.4 Simple file chooser dialog box
在這種方法下,最基本的做法就是使用HTML或者JavaScript來建立用戶見面,Python在后臺做進程處理工作。Python也可以建立HTML文件不使用任何用戶界面來顯示一些基本信息。
3.2.1 通過HTML顯示基本信息
應用中經常會遇到需要給用戶簡單的顯示大塊信息的時候,這時候可能是一個列表或者一個文本對話框,這兩種方法用HTML實現都非常簡單。我們可以用程序生成一個HTML文件然后通過調用webViewShow API來啟動它。
在下面我做了個簡單的程序,它將獲取電池狀態,并生成包含所有電池信息的HTML文件,然后通過調用webViewShow API來啟動這個HTML文件。運行此程序后將在/sdcard/sl4a/scripts路徑下產生一個名為battstats.html的文件。其顯示結果如圖5所示。

圖5 使用簡單的HTML文件顯示電池狀態Fig.5 Use of a simple HTML file to display battery status
3.2.2 HTML和JavaScript的應用
當我們想給顯示信息中加入一些交互元素的時候,就需要引入JavaScript了。SL4A提供了Python和web page的通信方法,并且events和JavaScript代碼也可以加入到web page中,但是在做API調用之前我們必須先在JavaScript代碼中用 var droid=new Android()來定義Android對象。
下面我嘗試做了一個較復雜的設置界面,它包含多個輸入框和多種輸入形式。用戶可以通過這個界面對設備的相關設置進行調整,包括屏幕亮度,媒體音量,鈴聲音量和WIFI模式等。首先我們需要用HTML制作一個界面。界面完成后我們遇到的首要問題就是如何將用戶設置的各項參數傳遞給Python,讓Python來做出相應的后臺處理。誠如前面所說,這個任務將交給JavaScript來完成,完成提取參數的關鍵工作是由document.getElementById()實現的。當設置參數成功傳遞給Python后,Python將根據用戶的具體設置對手機各硬件設備進行相應的調整。Python部分的核心代碼如下:
droid=android.Android()
droid.webViewShow(‘file:///sdcard/sl4a/scripts/settings.html’)
while True:
result=droid.waitForEvent('save').result
data=urlparse.parse_qs(result['data'][1:])
droid.toggleAirplaneMode('airplane'in data)
droid.toggleWifiState('wifi'in data)
droid.setScreenBrightness('screen'in data and 255 or 0)
運行程序的顯示結果如圖6所示。

圖6 設置界面Fig.6 My setting interface
Python是一門年輕、開源、充滿活力的腳本編程語言。在SL4A的支持下,Python可輕松實現Android平臺下應用的UI設計。它既可以通過調用Android的各種對話框實現與用戶的交互,也可以通過與HTML和JavaScript的配合來實現簡潔大方的框架式交互界面。隨著SL4A項目的影響越來越大,將有更多的Python愛好者嘗試并研究用Python來編寫Android應用,Python語言將會在Android應用開發中大有作為。
[1]鄭萌,趙常松.Android應用開發與典型案例[M].北京:電子工業出版社,2012.
[2]Mark L.Murphy.BeginningAndroid 2[M].United States of America:Apress,2010.
[3]Meier R.Professional Android Application Develop[M].WROX PR/PEER INFORMATION INC,2009.
[4]Steven Bird,Edward Loper,Ewan Klein.Natural language processing with Python [M].United States of America:O’Reilly Media,2009.
[5]Paul Barry.Head First Python[M].United States of America:O’Reilly,2011.
[6]Beazley D M.Python essential reference[M].Fourth Edition.Beijing:Post and Telecom Press,2011.
[7]Paul Ferrill.Pro android python with SL4A[M].United States of America:Apress,2011.