我们一开始介绍了如何搭建Ophone开发环境,接着就介绍了如何创建第一个Ophone程序,你或许会有疑问,在电脑上安装的这些软件和工具与程序HelloOPhone是什么关系,在整个工程中,除了我们编写的代码之外的那些文件又是什么?

  一 、开发平台结构

  首先,让我们来了解开发平台的几个组成部分。

  JDK:Java开发工具包,包括编译、文档和运行环境(JRE)等。

  OPhone SDK:专为OPhone平台设计的软件开发套件,包括OPhone API、OPhone模拟器、开发工具、示例代码和SDK帮助文档。OPhone SDK支持APK和 Web Widget两种类型的应用开发。

  ODT:作为Eclipse插件的OPhone开发套件,支持APK应用开发,即类似于HelloOPhone的应用程序。

  WDT:作为Eclipse插件的Widget开发套件,是一个采用HTML、JavaScript和CSS等网络技术的应用程序。

  OPhone系统是基于Linux内核构建的,不管是真机还是模拟器,在内核上有一个叫做Dalvik的Java虚拟机,所有应用程序都在虚拟机上运行。Eclipse是一个通用的IDE,不管是C++、Java还是Python,它都能很好地支持。Eclipse通过ODT插件来实现OPhone软件的运行和调试,如图1-23所示。


▲图1-23 OPhone开发平台结构图

  图中的AVD是虚拟设备,实现的是虚拟硬件的配置,并且将系统镜像映射到该设备上。你可以决定这个虚拟手机的键盘类型(全键盘或者触摸屏),决定它的分辨率,是否有摄像头,以及支持的SD卡等。是不是听起来很酷?这就是说你可以定制你的手机。定制的方法是在创建AVD时,当系统询问是否建立自定义配置时,选择“Yes”。可以在命令行下用“android avd”命令来查看参数和使用说明。

  图中的ADB是调试桥,可以通过它来管理设备的状态。它是C/S模式的软件,由3部分构成:设备上的守护进程、管理客户端和守护进程的服务器端、可以输入管理指令的客户端。在前文中使用真机调试时,就是将ADB的服务器端更改,以实现调试对象的改变。Eclipse的插件ODT,也是通过创建ADB客户端来实现的。可以在命令行下用“adb”命令来查看参数和使用说明。

  思考:

  1. OPhone应用程序运行时,用的是JDK中的JRE吗?

  2. 如果没有ODT,OPhone应用程序可以正常运行吗?

  3. 开发调试OPhone应用程序时,AVD是必须的吗?

  1. 否。HelloOPhone在编译链接的过程中用到了JDK,但在运行的过程中并未用到JDK,而是模拟器上的虚拟机。

  2. 是。ODT只是Eclipse和OPhone系统之间的桥梁,是开发者的工具。

  3. 否。如果应用程序原本就在系统中或者通过命令行加载应用程序,一样可以正常运行。如果在真机上运行,就不需要AVD了。

 

  二、 HelloOPhone工程组成

  你或许已经迫不及待地要打开图1-19中的HelloActivity.java这个文件看个究竟了,不过先别急,让我们首先从整体上来认识这个工程。从图1-20显示的Package Explorer中可以看到HelloOPhone的工程全貌,由源代码、生成文件、资源文件、库文件(Library)和AndroidManifest.xml构成。资源文件包含了程序运行时所需的一切图片、界面、图标等资源,库文件是开发过程中需要调用的文件。下面我们把重点放在AndroidManifest.xml和源代码上,单击Eclipse正中窗口下方的选项卡切换到源代码视图:

  package="oms.HelloPKG"

  android:versionCode="1"

  android:versionName="1.0">

  android:label="@string/app_name">

  1.代码结构

  现在来看AndroidManifest.xml的代码,如果你在此之前没有接触过XML,请不要担心,因为它只是一个描述型的语言,并未涉及程序的逻辑关系。在上述代码中,例如和后面的是一对,表示一层结构。你可以一层层剥下去直到。在XML中,有很多@符号,在这里也使用@符号,表示某个变量的引用,形如@[package:]type/name。

  有兴趣的读者可以尝试将XML文件中涉及的app_name和icon文件(在工程res文件夹下)用其他字符或者图标替换掉,看看程序会出现什么变化。

  2.文件功能

  AndroidManifest.xml文件描述了整个应用程序的结构,每一个OPhone工程必须在其根目录下包含该文件,且文件名不能改变。该文件定义了以下内容:Package名称,4大组件(Activity、Servicey、Broadcast Receiver、Content Provider)的特性、组件和进程的关系、程序权限、其他程序访问本程序的权限、配置和测试信息、可运行的系统最低版本、所需链接的库。

  3.详细解释

  上述代码前两行是所有程序都必须包含的属性。第一行是代码的版本和编码,这个很简单;第二行开头有xmlns:android="http://schemas.android.com/apk/res/ android,是用来声明命名空间的,后面的网址表示参照的 Android 命名空间提供的定义。其他的部分可以用这个比喻来理解:一个工程相当于一个软件包(Package),其中有多个应用程序(Application),每个程序中又有多个完成不同功能的窗体(Activity),窗体可以通过意图(Intent)来传递指令或数据,然而只有部分消息允许传递,这就需要意图过滤器(Intent-filter)。Intent-filter内有两行代码,当一个应用程序内有多个Activity的时候,说明了程序启动的入口,类似于Java或者C中的main函数;而这个Activity 将显示在桌面的应用程序列表中。运行的代码如下:

  package oms.HelloPKG;

  import android.app.Activity;

  import android.os.Bundle;

  public class HelloActivity extends Activity {

  /** Called when the activity is first created. */

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  }

  }

  上面为在软件中真正在运行的源代码,如果你具备Java基础,应该一眼就能看懂。这个HelloActivity继承自Activity,并且使用setContentView方法设置了界面。至于HelloActivity之上的Activity是怎么回事,我们暂时不去探究,初学者只需记住这种形式就可以了。setContentView类似于Java GUI中的setContentPane,设置了程序的界面。细心的读者也许会问,程序如何决定在界面上显示的是HelloOPhone还是GoodOPhone的字符串?是如何显示在界面上的?这些内容会在下节讲解。