APP下载

基于Python的Android应用GUI的开发

2013-01-16何浩李滔

电子设计工程 2013年9期
关键词:脚本插件调用

何浩,李滔

(西北工业大学 电子信息学院,陕西 西安 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应用了。

1 基于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应用的开发。

2 开发工具

我们可以直接在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应用开发了。

3 使用Python实现Android应用的GUI开发

GUI(Graphical User Interface)即图形用户接口,是人机交互最基本的工具,任何一款手机应用或是电脑软件都无法摆脱GUI的开发。在使用Python的探索开发过程中,我们发现有两种最基本的方式通过SL4A实现与用户的交互。第一种方法,直接调用Android API来生成对话框,如警告对话框。这是最简单、最直接的向用户传递信息并接受用户反馈的方法。第二种方法是使用HTML或者JavaScript来建立用户界面(UI),Python在后台做其他处理。

3.1 使用Python开发对话框类型的GUI

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

3.2 通过HTML建立Python GUI

在这种方法下,最基本的做法就是使用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

4 结束语

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.

猜你喜欢

脚本插件调用
酒驾
安奇奇与小cool 龙(第二回)
自编插件完善App Inventor与乐高机器人通信
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
快乐假期
小编的新年愿望
基于jQUerY的自定义插件开发
基于系统调用的恶意软件检测技术研究
基于Revit MEP的插件制作探讨