Android实践项目汇报(二)
2项目相关技术介绍与分析
本部分对项目开发相关技术进行介绍分析,Android操作系统内容包括:系统架构及应用程序。开发过程应用技术包括:Android文件存储方式,调用有道API进行翻译。
2.1 Android操作系统
Android是一种以Linux为基础的开放源代码操作系统,主要用于便携设备。Android是一个完整、开放、免费的手机平台,其具有以下突出特点:
1)开放性:在优势方面,Android平台首先就是其开放性,开放的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。
2)应用程序无界限:Android上的应用程序可以通过标准的API访问核心移动设备。通过互联网,应用程序可以他们的功能可供其他应用程序使用。
3)应用程序可以轻松嵌入地嵌入网络:应用程序可以轻松的嵌入HTML、JavaScript和样式表,还可以通过WebView显示网络内容。
4)无缝结合的Google应用:Android平台的手机可以很好的结合google服务。如google地图、邮件、搜索等。
2.1.1Android系统框架
Android操作系统架构和其他操作系统一样,采用了分层的架构。从架构图看Android系统架构为四层结构,从上层到下层分别是应用程序层、应用程序框架层、系统运行库层以及Linux内核层。如图2-1所示:
图2-1 Android系统框架图
(1)应用程序层
该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。
(2)应用程序框架层
该层是Android应用开发的基础,开发人员大部分情况是在和她打交道。应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。在Android平台上,开发人员可以完全访问核心应用程序所使用的API框架。并且,任何一个应用程序都可以发布自身的功能模块,而其他应用程序则可以使用这些已发布的功能模块。基于这样的重用机制,用户就可以方便地替换平台本身的各种应用程序组件。
(3)系统库和Android运行时
系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。Android运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如android.os、android.net、android.media等等。后者是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。
(4)Linux内核
Android核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。
2.1.2 Android应用程序
Android应用层主要有四个部分组成,分别是:活动(Activity),用于显示功能;服务(Service),相当于后台运行的Activity;广播(BroadcastReceiver),用于接收广播;内容提供者(Intent),用于存储并检索数据。
(1) Activity
一个Activity通常展现为一个可视化的用户界面,是Android程序与用户交互的窗口,也是Android组件中最基本也是最复杂的一个组件。从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生命周期,和一些转跳逻辑。对于开发者而言,需要派生一个Activity的子类,进而进行编码实现各种功能方法。
(2)service
服务是运行在后台的一个组件,从某从意义上说,服务就像一个没有界面的Activity。它们在很多Android的概念方面比较接近,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事件,定义好需要接受的Intent提供同步和异步的接口。Android中得服务其实与windows中得服务类似,它执行长时间运行的操作,或运程进程执行工作。服务不提供用户界面,例如在后台下载东西,播放音乐,在你播放音乐的同时还可以干其他事情,而不会阻塞用于与其他活动的交互。另一个组件,比如Activity可以启动一个服务,并运行或者绑定到它。
(3) Broadcast Receiver
广播接收者,不执行任何任务,广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件。Broadcast Receiver 不包含任何用户界面。然而它们可以启动一个Activity以响应接受到的信息,或者通过NotificationManager通知用户。可以通过多种方式使用户知道有新的通知产生:闪动背景灯、震动设备、发出声音等等。通常程序会在状态栏上放置一个持久的图标,用户可以打开这个图标并读取通知信息。在Android中还有一个很重要的概念就是Intent,如果说Intent是一个对动作和行为的抽象描述,负责组件之间程序之间进行消息传递。那么Broadcast Receiver组件就提供了一种把Intent作为一个消息广播出去,由所有对其感兴趣的程序对其作出反应的机制。
(4) Content Provider
作为应用程序之间唯一的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。 Android有一个独特之处就是,在 Android 中,每个应用程序都是用自己的用户 ID 并在自己的进程中运行。这样的好处是,可以有效地保护系统及应用程序,避免被其他不正常应用程序所影响,每个进程都拥有独立的进程地址空间和虚拟空间。Android的数据(包括files, database等…)都是属于应用程序自身,其他的应用是不能访问到的,更无法直接进行操作。所以如果你想实现不同应用之间的数据共享,就不得不用content provider了。为了使其他程序能够操作数据,在Android中,可以通过做成 ContentProvider提供数据操作的接口。其实对应用而言,也可以将底层数据封装成ContentProvider,这样可以有效的屏蔽底层操作的细节,并且使程序保持良好的扩展性和开放性。
2.2 调用有道翻译API
有道翻译API,为广大开发者提供开放接口。您的应用或网站可通过有道翻译API,构建丰富多样的功能或应用,为用户带来即时,准确,方便的查词或翻译体验,从而降低语言理解与应用门槛。依靠有道翻译网络数据挖掘和统计机器翻译技术实力做基础,加上您的智慧,将创造出更优良的体验和创新的功能。
json数据格式举例
http://fanyi.youdao.com/openapi.do?keyfrom=<keyfrom>&key=<key>&type=data&doctype=json&version=1.1&q=good
{
"errorCode":0
"query":"good",
"translation":["好"], // 有道翻译
"basic":{ // 有道词典-基本词典
"phonetic":"gʊd"
"uk-phonetic":"gʊd" //英式发音
"us-phonetic":"ɡʊd" //美式发音
"explains":[
"好处",
"好的"
"好"
]
},
"web":[ // 有道词典-网络释义
{
"key":"good",
"value":["良好","善","美好"]
},
{...}
]
}
在项目查词模块翻译模块通过访问网络接口,解析返回结果显示数据,重点部分代码为:public static Word doTranslateCc(String query) {
Word word = null;
// 以下URL 为申请的有道API的key
String urlStr = "http://fanyi.youdao.com/openapi.do?keyfrom=justTec&key=1249502330&type=data&doctype=json&version=1.1&q=" + query;
HttpClient httpClient = new DefaultHttpClient();
try {
String jsonData = "";
// 向指定的URL发送Http请求
HttpResponse response = httpClient.execute(new HttpGet(urlStr));
// 取得服务器返回的响应
HttpEntity entity = response.getEntity();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
String line = "";
while ((line = bufferedReader.readLine()) != null) {
jsonData = jsonData + line;
}
word = new Word();
// 详细请百度一下 有道API
JSONObject jsonObject = new JSONObject(jsonData);
word.setQuery(query);
word.setTranslation(jsonObject.getJSONArray("translation").getString(0));
JSONObject basic = jsonObject.getJSONObject("basic");
// 音标
word.setUk(basic.getString("uk-phonetic").trim());
word.setUs(basic.getString("us-phonetic").trim());
// 返回json数组
String otherString = "";
JSONArray otherArray = basic.getJSONArray("explains");
for (int i = 0; i < otherArray.length(); i++) {
otherString += ";" + otherArray.getString(i);
}
word.setExplains(otherString.substring(1));
} catch (Exception e) {
}
return word;
}
}
遇到的问题
DPAD not enabled in avd
打开Android的仿真器,右侧的按键部分对于上下左右键出现以下现象:
按键都没法使用
我看了好几个论坛,再加上自己总结,解决方法如下:
1、打开Eclipse中的Android AVD
2、选择其中任何一个,点击右边的Details
3、按照Path的地址,找到该文件
4、打开文件夹,找到里面的config.ini文件,修改
5、保存之后,在重新Start AVD,结果如下:
哈哈,大功告成!!!