目 录
1.
智能手机的发展历史 .................................................................................. 1 2. Android架构 ..................................................................................................... 3 2.1 架构图直观 ......................................................................................................... 3 2.2 架构详解 ............................................................................................................. 3 3. Android应用开发技术课程知识点总结 ......................................................... 5 3.1 Android Audio框架 ............................................................................................. 4 4. 手机淘宝系统开发 ........................................................................................ 10 4.1 首页 ..................................................................................................................... 8
4.1.1要点分析 ................................................................................................... 8 4.1.2核心源码 ................................................................................................... 8 4.1.3 运行效果 ................................................................................................ 11 4.2 搜索页 ............................................................................................................... 11
4.2.1要点分析 ................................................................................................. 12 4.2.2核心源码 ................................................................................................. 14 4.2.3 运行效果 ................................................................................................ 14 4.3 登录页 ............................................................................................................... 14
4.3.1要点分析 ................................................................................................. 15 4.3.2核心源码 ................................................................................................. 15 4.3.3 运行效果 ................................................................................................ 19 4.4订单页 ................................................................................................................ 19
4.4.1要点分析 ................................................................................................. 19 4.4.2核心源码 ................................................................................................. 19 4.4.3 运行效果 ................................................................................................ 24 4.5小结 .................................................................................................................... 25 5. APP开发技术的发展 ..................................................................................... 25 6. 致谢 ................................................................................................................ 26 参考文献 ............................................................................................................. 27 附录 ..................................................................................................................... 28
I
湖北大学本科课程设计(论文)
1. 智能手机的发展历史
智能手机的发展史大致可分为1990年代智能手机刚刚问世的“黎明期”、2000年~2006年商务智能手机繁荣发展的“商用机扩大期”、以及2007年以后逐步走进普通消费者视野的“大众普及期”。另外,日本从 1997年开始提供i模式服务,使得手机的功能大幅提高,符合智能手机定义的产品成为主流。为了避免混乱,本文以欧美产品为主介绍智能手机的发展历程。
智能手机黎明期(1990年代)
全球首款智能手机是美国IBM 公司1994年投放市场的“IBM Simon”。这款手机装配备了使用手写笔的触摸屏,除了通话功能之外,还具备PDA及游戏功能。OS采用的是夏普PDA的“Zaurus OS”。
1996年芬兰诺基亚公司推出了名为“Nokia 9000 Communicator”的折叠式智能手机。该产品在折叠状态下就是一款手机,打开后则会出现QWERTY 键盘、十字键及长方形黑白显示屏等。OS 采用美国Breadbox Computer Company的“GEOS”。Nokia 9000 Communicator 受到了商务人士的青睐,后来逐步演变为1998年上市的“诺基亚9110”、由诺基亚9110按照美国的手机频率改进而来并于2000年上市的“诺基亚9110i”,后来又推出了采用Symbian OS的机型。
1997年,瑞典爱立信公司推出了与Nokia 9000 Communicator相似的“GS88”手机。该手机的说明书中首次出现了“智能手机”一词。
商用机扩大期(2000年~2006年) 进入2000年以后,市场上出现了很多采用面向 PDA及嵌入设备的通用OS的智能手机。这些手机使用 Symbian、Palm OS及Windows CE等OS。
首次采用Symbian OS 的智能手机是爱立信的 “Ericsson R380 Smartphone”。该机的数字键部分采用可像门一样开关的机构,打开后会出现长方形触摸屏,可作为PDA 使用。合上后可作为手机使用。继爱立信之后,诺基亚也于2000年投放了采用Symbian OS 的智能手机,后来诺基亚的智能手机便一直使用 Symbian OS。
配备Palm OS 的首款手机是京瓷的“Kyocera 6035”。该手机的形态与Ericsson R380基本相同,打开数字键部分时,可作为Palm PDA使用。该手机于2001年2月上市。
至于Windows CE 智能手机系统,最早是美国微 软公司2002年发布的“Microsoft Windows Powered Smartphone 2002”。配备该系统的首款手机是微软自己推出的“Orange SPV”(由宏达国际电子生产)。该OS系列后来被更名为“Windows Mobile”,韩国三星电子及夏普等公司向市场投放了多款采用这种OS的智能手机。
加拿大RIM(Research In Motion)公司的现行“黑莓”(BlackBerry)手机的首款原始机型问世于 2003年。该机配备QWERTY键,融合了电子邮件、SMS 及Web浏览等功能。
以上这些手机均以企业用户为目标,以嵌入商务软件的形式提供。因此,基本未向普通消费者推广。
大众普及期(2007年~)
让普通消费者购买并使用智能手机。掀起这股潮流的是美国苹果公司于2 0 0 7 年6 月投放市场的 iPhone。这款手机配备有几乎所有操作都以触摸屏完成的用户界面(UI)、
湖北大学本科课程设计(论文)
基本与个人电脑同等的Web浏览器和电子邮件功能,以及与iTunes 联动的音乐播放软件等,从而将智能手机提高到了任何人都能使用的水平。
随后,美国谷歌公司于2007年11月发布了智能手机软件平台Android。2008年,美国T-Mobile USA公司推出了首款配备Android的智能手机“T-Mobile G1” (由宏达国际电子生产)。此后,美国摩托罗拉移动公司、三星电子以及日本与瑞典的合资公司索尼爱立信移动通信等公司都相继推出了Android智能手机。
之前一直开发企业用智能手机OS的微软在看到 iPhone与Android成功之后也转变了方针,于2009年 2月宣布开发出面向普通消费者的“Windows Mobile 6.5”及“Windows Phone 7”。
采用Windows Mobile 6.5的手机于2009年10月投放市场,Windows Phone 7手机则于2010年10月问世。
当前主流智能手机
IOS 代表机型:iPhone 4S iOS是(又称iPhone OS)由苹果公司为iPhone开发的操作系统,它主要是给iPhone、iPod touch以及iPad使用。最新版本为iOS5 。
Android代表机型:Samsung Galaxy
Android ( 中文名:安卓) 是基于Linux平台开源手机操作系统名称,目前在市场上可谓如日中天,越来越受到玩家的青睐,支持厂商很多。目前市面上几大系统中,Android的市场占有率最高,上升速度最快。
WP代表机型:诺基亚 Lumia800
作为软件巨头微软的掌上版本操作系统,在与桌面PC和Office办公的兼容性方面具有先天的优势,办公娱乐两不误。以商务用机为主,目前市场已显出颓势,最新版本为WindowsPhone7.5.支持厂商:中国HTC、韩国三星电子、韩国LG、英国索尼爱立信、诺基亚与2011年初正式宣布与微软合作,将采用WP7操作系统。
Windows Mobile代表机型:多普达S1
作为PDA专用系统WindowsCE在手机上的一个延伸,WM系统的推出可以看出微软对于智能手机操作系统市场的重视。WM系统有很多先天的优势,由于硬件要求极高使价格也高了,耗电还是很比较大,稳定性相对较差。代表机型:多普达S1、P800,夏新、联想均有涉及。
Symbian代表机型:诺基亚 N8 Symbian(中文名:塞班)是一个实时性、多任务的纯32位操作系统,具有功耗低、内存占用少等特点,非常适合手机等移动设备使用,经过不断完善,并长期居于首位,但是Symbian S60、Symbian3,UIQ等(尤其是S60)系统近两年亦遭遇到显著的发展瓶颈。支持厂商:诺基亚。
MeeGo代表机型:诺基亚N9
MeeGo是诺基亚和英特尔宣布推出一款基于Linux的平台被称为MeeGo,融合了诺基亚的Maemo和英特尔的Moblin平台。如诺基亚新品N9就是采用MeeGo1.2系统的。支持厂商:诺基亚。
BlackBerry OS
BlackBerry OS是RIM公司开发出的与黑莓手机配套的系统,目前在全世界都颇受欢迎,在此系统基础上,黑莓的手机更是独树一帜的在智能手机市场拼搏,目前也已在中国形成了大笔粉丝。支持厂商:RIM
三星Bada
bada是韩国三星公司自行开发的智能手机平台,支持丰富功能和用户体验的软件
湖北大学本科课程设计(论文)
应用,于2009年11月10日发布。bada在韩语里是“海洋”的意思。 bada的设计目标是开创人人能用智能手机的时代。支持厂商:三星2. Android架构
2.1 架构图直观
下面这张图展示了Android系统的主要组成部分:
图1.1-1 Android系统架构(来源于:android sdk)
可以很明显看出,Android系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。第二部分将详细介绍这5个部分。
2.2架构详解
现在我们拿起手术刀来剖析各个部分。其实这部分SDK文档已经帮我们做得很好了,我们要做的就是拿来主义,然后再加上自己理解。下面自底向上分析各层。
2.2.1Linux Kernel
Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。
湖北大学本科课程设计(论文)
如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各司其职,各层提供固定的SAP(Service Access Point),专业点可以说是高内聚、低耦合。
如果你只是做应用开发,就不需要深入了解Linux Kernel层。
2.2.2Android Runtime
Android 包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己 的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统。
大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。 两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以將 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有時必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。
Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。
2.2.3Libraries
Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库:
系统C库——标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备
媒体库——基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、 H.2、 MP3、 AAC、 AMR、JPG、 PNG
界面管理——管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层 LibWebCore——新式的Web浏览器引擎,驱动Android 浏览器和内嵌的web视图
SGL——基本的2D图形引擎
3D库——基于OpenGL ES 1.0 APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅
FreeType ——位图和矢量字体渲染
SQLite ——所有应用程序都可以使用的强大而轻量级的关系数据库引擎
2.2.4 Application Framework
通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。
开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全)。这一机制允许用户替换组件。
所有的应用程序其实是一组服务和系统,包括:
视图(View)——丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器
内容提供者(Content Providers)——使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据
湖北大学本科课程设计(论文)
资源管理器(Resource Manager)——提供访问非代码资源,如本地化字符串、图形和布局文件
通知管理器(Notification Manager)——使所有的应用程序能够在状态栏显示自定义警告
活动管理器(Activity Manager)——管理应用程序生命周期,提供通用的导航回退功能
2.2.5 Applications
Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发!
3. Android应用开发技术课程知识点总结
Android Audio框架
media库中的Audio框架部分
Android的Audio系统的核心框架在media库中提供,对上面主要实现AudioSystem、AudioTrack和AudioRecorder三个类。
提供了IAudioFlinger类接口,在这个类中,可以获得IAudioTrack和IAudioRecorder两个接口,分别用于声音的播放和录制。AudioTrack和AudioRecorder分别通过调用IAudioTrack和IAudioRecorder来实现。
Audio系统的头文件在frameworks/base/include/media/目录中,主要的头文件如下: AudioSystem.h:media库的Audio部分对上层的总管接口; IAudioFlinger.h:需要下层实现的总管接口; AudioTrack.h:放音部分对上接口;
IAudioTrack.h:放音部分需要下层实现的接口; AudioRecorder.h:录音部分对上接口;
IAudioRecorder.h:录音部分需要下层实现的接口。
IAudioFlinger.h、IAudioTrack.h和IAudioRecorder.h这三个接口通过下层的继承来实现(即AudioFlinger)。
AudioFlinger.h、AudioTrack.h和AudioRecorder.h是对上层提供的接口,它们既供本地程序调用(例如声音的播放器、录制器等),也可以通过JNI向Java层提供接口。
meida库中Audio部分的结构如图所示。
湖北大学本科课程设计(论文)
从功能上看,AudioSystem负责的是Audio系统的综合管理功能,而AudioTrack和AudioRecorder分别负责音频数据的输出和输入,即播放和录制。
AudioSystem.h中主要定义了一些枚举值和set/get等一系列接口,如下所示:
class AudioSystem {
public: enum stream_type {
// Audio 流的类型 SYSTEM = 1, RING = 2, MUSIC = 3, ALARM = 4,
NOTIFICATION = 5, BLUETOOTH_SCO = 6, ENFORCED_AUDIBLE = 7, NUM_STREAM_TYPES
湖北大学本科课程设计(论文)
};
enum audio_output_type { };
enum audio_format { };
enum audio_mode { };
enum audio_routes { };
// …… 省略部分内容
static status_t setMasterVolume(float value);
// Audio 路径类型
ROUTE_EARPIECE = (1 << 0), ROUTE_SPEAKER = (1 << 1), ROUTE_BLUETOOTH_SCO = (1 << 2), ROUTE_HEADSET = (1 << 3),
ROUTE_BLUETOOTH_A2DP = (1 << 4), ROUTE_ALL = -1UL, // Audio模式 // …… 省略部分内容 // Audio数据格式 FORMAT_DEFAULT = 0, PCM_16_BIT, PCM_8_BIT, INVALID_FORMAT // Audio数据输出类型 // …… 省略部分内容
湖北大学本科课程设计(论文)
static status_t setMasterMute(bool mute);
static status_t getMasterVolume(float* volume); static status_t getMasterMute(bool* mute);
static status_t setStreamVolume(int stream, float value);
static status_t setStreamMute(int stream, bool mute); static status_t getStreamVolume(int stream, float* volume);
static status_t getStreamMute(int stream, bool* mute); static status_t setMode(int mode); static status_t getMode(int* mode);
static status_t setRouting(int mode,uint32_t routes, uint32_t mask);
static status_t getRouting(int mode, uint32_t* routes);
// …… 省略部分内容
};
在Audio系统的几个枚举值中,audio_routes是由单独的位来表示的,而不是由顺序的枚举值表示,因此这个值在使用过程中可以使用\"或\"的方式。例如,表示声音可以既从耳机(EARPIECE)输出,也从扬声器(SPEAKER)输出,这样是否能实现,由下层提供支持。在这个类中,set/get等接口控制的也是相关的内容,例如Audio声音的大小、Audio的模式、路径等。
AudioTrack是Audio输出环节的类,其中最重要的接口是write(),主要的函数如下所示。
class AudioTrack {
typedef void (*callback_t)(int event, void* user, void *info);
AudioTrack( int streamType, uint32_t sampleRate = 0,
// 音频的采样律 int format = 0,
//音频的格式(例如8位或者16位的PCM) int channelCount = 0, // 音频的通道数 int frameCount = 0, // 音频的帧数
uint32_t flags = 0, callback_t cbf = 0, void* user = 0, int notificationFrames = 0);
湖北大学本科课程设计(论文)
}
void start(); void stop(); void flush(); void pause(); void mute(bool);
ssize_t write(const void* buffer, size_t size); // …… 省略部分内容
AudioRecord是Audio输入环节的类,其中最重要的接口为read(),主要的函数如下所示。
class AudioRecord {
public: AudioRecord(int streamType, uint32_t sampleRate = 0,
// 音频的采样律 int format = 0,
// 音频的格式(例如8位或者16位的PCM) int channelCount = 0, // 音频的通道数 int frameCount = 0, // 音频的帧数
uint32_t flags = 0, callback_t cbf = 0, void* user = 0, int notificationFrames = 0);
}
AudioTrack和AudioRecord的read/write函数的参数都是内存的指针及其大小,内存中的内容一般表示的是Audio的原始数据(PCM数据)。这两个类还涉及Auido数据格式、通道数、帧数目等参数,可以在建立时指定,也可以在建立之后使用set()函数进行设置。
在libmedia库中提供的只是一个Audio系统框架,AudioSystem、AudioTrack和AudioRecord分别调用下层的IAudioFlinger、IAudioTrack和IAudioRecord来实现。另外的一个接口是IAudioFlingerClient,它作为向IAudioFlinger中注册的,相当于使用回调函数获取IAudioFlinger运行时信息。
status_t start(); status_t stop();
ssize_t read(void* buffer, size_t size); // …… 省略部分内容
湖北大学本科课程设计(论文)
2. 手机淘宝系统开发
4.1 首页
4.1.1要点分析
首页应该注意两点:接受和发送数据不能出现数据的阻塞,不容就会出现闪退的情况;首页相当于整个app的脸面,所以首页的UI设计非常重要,另外还要考虑app的页面要适应不同大小的屏幕,否则客户体验度就会急剧下降。
4.1.2核心源码
//初始化手机信息数据
private Boolean inintInfo(int num){ Id = new String[num];
Brands = new String[num]; Price = new String[num]; Name = new String[num]; Nettype = new String[num]; Cpu = new String[num]; Ram = new String[num]; BCamera = new String[num]; Screesize = new String[num]; Battery = new String[num]; ImgUrl=new String[num]; return true; }
//获取网络请求结果
private String connServerForResult(String strUrl) {
// HttpGet对象
HttpGet httpRequest = new HttpGet(strUrl); String strResult = \"\"; try { // HttpClient对象 HttpClient httpClient = new DefaultHttpClient(); // 获得HttpResponse对象 HttpResponse httpResponse = httpClient.execute(httpRequest); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
湖北大学本科课程设计(论文)
}
{
// 取得返回的数据
strResult = EntityUtils.toString(httpResponse.getEntity());
}
} catch (ClientProtocolException e) { System.out.println(\"protocol error:\"+e.getMessage()); e.printStackTrace(); Log.d(\"check\ solveNoConnection(); } catch (IOException e) { System.out.println(\"IO error:\"+e.getMessage()); e.printStackTrace(); Log.d(\"check\ solveNoConnection(); }
return strResult;
//网络请求错误时执行
private Boolean solveNoConnection(){ connectRight=false;
Log.d(\"check\网络请求错误处理!\"); state.setText(\"无网络或网络访问失败!\"); return true; }
// 普通Json数据解析
private void parseJson(String strResult) { try { JSONObject jsonObj = new JSONObject(strResult); int count=Integer.parseInt(jsonObj.getString(\"num\").toString()); Count=count; inintInfo(count); Log.d(\"check\:\"+jsonObj.toString()); JSONArray PhoneId=jsonObj.getJSONArray(\"Id\"); JSONArray brands=jsonObj.getJSONArray(\"Brands\"); JSONArray price=jsonObj.getJSONArray(\"Price\"); JSONArray name=jsonObj.getJSONArray(\"Name\"); JSONArray nettype=jsonObj.getJSONArray(\"Nettype\");
湖北大学本科课程设计(论文)
}
JSONArray cpu=jsonObj.getJSONArray(\"Cpu\"); JSONArray ram=jsonObj.getJSONArray(\"Ram\"); JSONArray bCamera=jsonObj.getJSONArray(\"BCamerab\"); JSONArray screesize=jsonObj.getJSONArray(\"Screesize\"); JSONArray battery=jsonObj.getJSONArray(\"Battery\"); JSONArray imgUrl=jsonObj.getJSONArray(\"ImgUrl\"); for(int i=0;i 湖北大学本科课程设计(论文) 4.1.3 运行效果 图4.1.3-1 4.2 搜索页 4.2.1要点分析 搜索页的核心点在于webService的接口要设计好,接受数据和发送数据的接口都要精心设计,尤其要注意缓冲模块的设计,否则容易出现数据阻塞。在从webService获取数据时,要考虑好对异常情况的处理,如果异常情况没处理好,app运行到这里就会出现闪退的情况。 4.2.2核心源码 //初始化手机信息数据 private Boolean inintInfo(int num){ Id = new String[num]; Brands = new String[num]; Price = new String[num]; Name = new String[num]; Nettype = new String[num]; Cpu = new String[num]; Ram = new String[num]; BCamera = new String[num]; 湖北大学本科课程设计(论文) Screesize = new String[num]; Battery = new String[num]; ImgUrl=new String[num]; return true; } //获取网络请求结果 private String connServerForResult(String strUrl) { } // HttpGet对象 HttpGet httpRequest = new HttpGet(strUrl); String strResult = \"\"; try { // HttpClient对象 HttpClient httpClient = new DefaultHttpClient(); // 获得HttpResponse对象 HttpResponse httpResponse = httpClient.execute(httpRequest); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 取得返回的数据 strResult = EntityUtils.toString(httpResponse.getEntity()); } } catch (ClientProtocolException e) { System.out.println(\"protocol error:\"+e.getMessage()); e.printStackTrace(); Log.d(\"check\ solveNoConnection(); } catch (IOException e) { System.out.println(\"IO error:\"+e.getMessage()); e.printStackTrace(); Log.d(\"check\ solveNoConnection(); } return strResult; //网络请求错误时执行 private Boolean solveNoConnection(){ Log.d(\"check\网络请求错误处理!\"); searchState.setText(\"无网络或网络访问失败!\"); return true; 湖北大学本科课程设计(论文) } // 普通Json数据解析 private void parseJson(String strResult) { try { JSONObject jsonObj = new JSONObject(strResult); int count=Integer.parseInt(jsonObj.getString(\"num\").toString()); Count=count; inintInfo(count); Log.d(\"check\:\"+jsonObj.toString()); JSONArray PhoneId=jsonObj.getJSONArray(\"Id\"); JSONArray brands=jsonObj.getJSONArray(\"Brands\"); JSONArray price=jsonObj.getJSONArray(\"Price\"); JSONArray name=jsonObj.getJSONArray(\"Name\"); JSONArray nettype=jsonObj.getJSONArray(\"Nettype\"); JSONArray cpu=jsonObj.getJSONArray(\"Cpu\"); JSONArray ram=jsonObj.getJSONArray(\"Ram\"); JSONArray bCamera=jsonObj.getJSONArray(\"BCamerab\"); JSONArray screesize=jsonObj.getJSONArray(\"Screesize\"); JSONArray battery=jsonObj.getJSONArray(\"Battery\"); JSONArray imgUrl=jsonObj.getJSONArray(\"ImgUrl\"); for(int i=0;i 湖北大学本科课程设计(论文) error:\"+e.getMessage(),Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } 4.2.3 运行效果 图4.2.3-1 4.3 登录页 4.3.1要点分析 登录页最核心的功能就是验证用户的身份,最不容易实现的点就是保持用户的登录。对于这一点,我们采用的是Intent和Bunddle结合的办法,每到一个页面就传一个用户身份的验证信息过去,这样就能保证无论跳转到哪个界面,用户都能保持登录。 但实际上,这种方法并不好用,这种方法对于主Activity(app中为HomeAcivity)并不适用。所以,最后我们采用了在类里面设置静态变量的办法,这个静态变量可以通过类来访问,从而达到了身份验证信息数据共享的效果。 4.3.2核心源码 // 防止网络请求在MainThread中产生异常 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() 湖北大学本科课程设计(论文) .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().detectLeakedClosableObjects() .penaltyLog().penaltyDeath().build()); usernameEditText = (EditText) findViewById(R.id.username_txt); userpwdEditText = (EditText) findViewById(R.id.userpwd_txt); login = (Button) findViewById(R.id.blogin); textshow = (TextView) findViewById(R.id.show); textshow.setText(\"数据显示:未获取到数据\"); login.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { get_name = usernameEditText.getText().toString(); get_pwd = userpwdEditText.getText().toString(); strUrl = \"http://192.168.1.103/for_phone/WebService/Login.ashx\"; strUrl = strUrl + \"?new_txtUser=\" + get_name +\"&new_txtPsw=\"+ get_pwd; Log.d(\"result\ String strResult = connServerForResult(strUrl); Log.d(\"result\ // 解析Json字符串 parseJson(strResult); Log.d(\"result\ Intent intent=new Intent(); intent.setClass(LoginActivity.this,IndentActivity.class); Bundle bundle=new Bundle(); bundle.putString(\"Uid\ intent.putExtra(\"data\ startActivity(intent); HomeActivity.UserId=Uid; Log.d(\"trans\ } }); 湖北大学本科课程设计(论文) search= (ImageButton)findViewById(R.id.menu_search_img); //login=(ImageButton)findViewById(R.id.menu_login_img); form=(ImageButton)findViewById(R.id.menu_indent_img); home=(ImageButton)findViewById(R.id.menu_home_img); search.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { Intent intent=new Intent(); intent.setClass(LoginActivity.this, SearchActivity.class); Bundle bundle=new Bundle(); bundle.putString(\"Uid\ intent.putExtra(\"data\ startActivity(intent); } }); form.setOnClickListener(new View.OnClickListener() { //订单 @Override public void onClick(View arg0) { Intent intent=new Intent(); intent.setClass(LoginActivity.this,IndentActivity.class); Bundle bundle=new Bundle(); bundle.putString(\"Uid\ intent.putExtra(\"data\ startActivity(intent); } }); home.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { Intent intent=new Intent(); intent.setClass(LoginActivity.this, HomeActivity.class); Bundle bundle=new Bundle(); bundle.putString(\"Uid\ intent.putExtra(\"data\ UserInfo user=new UserInfo(); user.setId(Uid); Log.d(\"trans\ startActivity(intent); HomeActivity.UserId=Uid; 湖北大学本科课程设计(论文) Log.d(\"trans\ } }); } private String connServerForResult(String strUrl) { // HttpGet对象 HttpGet httpRequest = new HttpGet(strUrl); String strResult = \"\"; try { // HttpClient对象 HttpClient httpClient = new DefaultHttpClient(); // 获得HttpResponse对象 HttpResponse httpResponse = httpClient.execute(httpRequest); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 取得返回的数据 strResult = EntityUtils.toString(httpResponse.getEntity()); //getData.setText(\"raw Json:\"+ strResult); } } catch (ClientProtocolException e) { textshow.setText(\"protocol error\"); Toast.makeText(LoginActivity.this,\"protocol error\ e.printStackTrace(); } catch (IOException e) { textshow.setText(\"IO error\"); e.printStackTrace(); } return strResult; } // 普通Json数据解析 private void parseJson(String strResult) 湖北大学本科课程设计(论文) { try { JSONObject jsonObj = new JSONObject(strResult); // JSONArray jsonObjArray=new JSONArray() String sta1 = jsonObj.getString(\"user\"); String sta2 = jsonObj.getString(\"psw\"); String sta3 = jsonObj.getString(\"sta\"); String sta4 =jsonObj.getString(\"uid\"); Uid=sta4; textshow.setText(sta1 + \" 、 \" + sta2 + \"、\" + sta3+\"、\"+ sta4); Toast.makeText(LoginActivity.this,\"JSON数据解析成功\ } catch (JSONException e) { System.out.println(\"Json parse error\"); e.printStackTrace(); Log.d(\"error\ Toast.makeText(LoginActivity.this,\"JSON获取错\ } } ! 误 4.3.3 运行效果 图4.3.3-1 湖北大学本科课程设计(论文) 4.4订单页 4.4.1要点分析 订单页有两个核心点: 1.获取用户的ID,这个可以在登陆页验证用户身份后,获取用户的ID; 2.向WebService发送请求并接收web服务器发回来的数据,也就是接口的设计要考虑完善。 4.4.2核心源码 //读取手机商品信息列表情况 // 防止网络请求在MainThread中产生异常 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().detectLeakedClosableObjects() .penaltyLog().penaltyDeath().build()); //strUrl \"http://192.168.1.103/for_phone/WebService/orderForm.ashx?uID=\"+Uid; strUrl \"http://192.168.1.103/for_phone/WebService/orderForm.ashx?uID=000001\"; String strResult = connServerForResult(strUrl); Log.d(\"check\请求返回结果strResult:\"+strResult.toString()); /* if(strResult==null || strResult.equals(\"\") ){ = = strResult=\"{\\\"num\\\":1,\\\"Id\\\":[\\\"000000\\\"],\\\"Brands\\\":[\\\"无网络\\\"],\\\"Price\\\":[\\\"000\\\"],\\\"Name\\\":[\\\"无网络\\\"],\\\"Nettype\\\":[\\\"无网络\\\"],\\\"Cpu\\\":[\\\"无网络\\\"],\\\"Ram\\\":[\\\"无网络\\\"],\\\"BCamerab\\\":[\\\"无网络\\\"],\\\"Screesize\\\":[\\\"无网络\\\"],\\\"Battery\\\":[\\\"无网络\\\"],\\\"ImgUrl\\\":[\\\"\\\"]}\"; }*/ parseJson(strResult); Log.d(\"result\ /* * 给界面HomeListView初值 * */ listView=(ListView)findViewById(R.id.listviewindent); ArrayList 湖北大学本科课程设计(论文) for(int i=0;i map.put(\"Operating_Sys\操作系统 : \"+operating_Sys[i]); map.put(\"Color\颜 色 : \"+color[i]); Bitmap bitmap =getHttpBitmap(HomeUrl+photo[i]); if(img_get==false) { //img.setImageResource(R.drawable.login_released); map.put(\"Photo\ } else{ //img .setImageBitmap(bitmap); map.put(\"Photo\ } map.put(\"Quantity\数 量 : \"+quantity[i]); map.put(\"Moneys\订单金额 : \"+moneys[i]+\"元\"); map.put(\"BuyerAddress\收货地址 : \"+buyerAddress[i]); String pay=null; if(isPayment[i].toString().equals(\"true\")) pay=\"已付款\"; else pay=\"未付款\"; map.put(\"IsPayment\订单状态 : \"+pay); map.put(\"OrderTime\订单时间 : \"+orderTime[i]); listItem.add(map); } //生成适配器的Item和动态数组对应的元素 SimpleAdapter intentAdapter = new SimpleAdapter(this,listItem,//数据源 R.layout.intent_item,//ListItem的XML实现 //动态数组与ImageItem对应的子项 new String[] {\"Photo\\"SellerID\\"Color\ //ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] {R.id.img,R.id.OrderID,R.id.BuyerID,R.id.SellerID,R.id.Brand,R.id.Operating_Sys,R.id.Color,R.id.Quantity,R.id.Moneys,R.id.IsPayment,R.id.OrderTime,R.id.BuyerAddress} ); //添加并且显示 湖北大学本科课程设计(论文) listView.setAdapter(intentAdapter); } //初始化手机信息数据 private Boolean inintInfo(int num){ orderID = new String[num]; buyerID = new String[num]; sellerID = new String[num]; brand = new String[num]; operating_Sys = new String[num]; photo = new String[num]; quantity = new String[num]; moneys = new String[num]; buyerAddress = new String[num]; isPayment = new String[num]; orderTime=new String[num]; color=new String[num]; return true; } //获取网络请求结果 private String connServerForResult(String strUrl) { // HttpGet对象 HttpGet httpRequest = new HttpGet(strUrl); String strResult = \"\"; try { // HttpClient对象 HttpClient httpClient = new DefaultHttpClient(); // 获得HttpResponse对象 HttpResponse httpResponse = httpClient.execute(httpRequest); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { // 取得返回的数据 strResult = EntityUtils.toString(httpResponse.getEntity()); } } catch (ClientProtocolException e) { System.out.println(\"protocol error:\"+e.getMessage()); e.printStackTrace(); Log.d(\"check\ solveNoConnection(); 湖北大学本科课程设计(论文) } } catch (IOException e) { System.out.println(\"IO error:\"+e.getMessage()); e.printStackTrace(); Log.d(\"check\ solveNoConnection(); } return strResult; //网络请求错误时执行 private Boolean solveNoConnection(){ connectRight=false; } Log.d(\"check\网络请求错误处理!\"); //state.setText(\"无网络或网络访问失败!\"); return true; // 普通Json数据解析 private void parseJson(String strResult) { try { JSONObject jsonObj = new JSONObject(strResult); int count=Integer.parseInt(jsonObj.getString(\"num\").toString()); Count=count; inintInfo(count); Log.d(\"check\:\"+jsonObj.toString()); JSONArray OrderID=jsonObj.getJSONArray(\"OrderID\"); JSONArray BuyerID=jsonObj.getJSONArray(\"BuyerID\"); JSONArray SellerID=jsonObj.getJSONArray(\"SellerID\"); JSONArray Brand=jsonObj.getJSONArray(\"Brand\"); JSONArray Operating_Sys=jsonObj.getJSONArray(\"Operating_Sys\"); JSONArray Color=jsonObj.getJSONArray(\"Color\"); JSONArray Quantity=jsonObj.getJSONArray(\"Quantity\"); JSONArray Moneys=jsonObj.getJSONArray(\"Moneys\"); JSONArray BuyerAddress=jsonObj.getJSONArray(\"BuyerAddress\"); JSONArray IsPayment=jsonObj.getJSONArray(\"IsPayment\"); JSONArray Photo=jsonObj.getJSONArray(\"Photo\"); JSONArray OrderTime=jsonObj.getJSONArray(\"OrderTime\"); for(int i=0;i 湖北大学本科课程设计(论文) brand[i]=Brand.getString(i); operating_Sys[i]=Operating_Sys.getString(i); color[i]=Color.getString(i); quantity[i]=Quantity.getString(i); moneys[i]=Moneys.getString(i); buyerAddress[i]=BuyerAddress.getString(i); isPayment[i]=IsPayment.getString(i); photo[i]=HomeUrl+Photo.getString(i); orderTime[i]=OrderTime.getString(i); Log.d(\"check\获取图片地址:\"+photo[i]); } }catch (JSONException e) { System.out.println(\"Json parse error:\"+e.getMessage()); Log.d(\"check\ //state.setText(\"Json parse error:\"+e.getMessage()); Toast.makeText(IndentActivity.this,\"Json error:\"+e.getMessage(),Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } public static Bitmap getHttpBitmap(String url) { URL myFileUrl = null; Bitmap bitmap = null; try { Log.d(\"check\图片url\"+url); myFileUrl = new URL(url); img_get=true; } catch (MalformedURLException e) { e.printStackTrace(); img_get=false; } try { HttpURLConnection conn = myFileUrl.openConnection(); conn.setConnectTimeout(0); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); img_get=false; parse (HttpURLConnection) 湖北大学本科课程设计(论文) } return bitmap; } 4.4.3 运行效果 图4.4.3-1 4.5小结 这个项目在技术实现上,有两个大的方面要考虑: 1. 从网络获取数据:这是我们之前一直没有学过的,所以,这点就 成了我们本次项目的一个技术难题,最后学习了老师发的demo才得以解决。但使用的仍然是单线程获取网络数据,对于图片的加载很吃力。要解决这个问题,就必须用异步传输技术在另外一个线程中加载图片。 2. 界面的UI:这对于初学者来说是个比较花时间的地方,难度不是 很大,但要设计出漂亮的界面效果,也是不容易的。如果自己这方面功底比较欠缺,在后面的学习中,就要善于运用网上的模板来搭出漂亮的界面。 3. 5. APP开发技术的发展 如今,智能手机已全面占领手机消费市场,在影响着通信产业发展的同时,改变着大众 湖北大学本科课程设计(论文) 的媒体接触方式和消费习惯,也对企业在移动互联时代下的营销能力提出了新的挑战。而智能手机的出现,带来了海量的APP,它们渗透到人们衣食住行的各个方面,给大众生活增添了不少的乐趣、优惠和便利。 在APP不断深入大众生活的同时,不少企业意识到APP的营销价值,希望借助APP掌握移动互联营销先机。具体来说,用户手机中的企业APP提高了企业标识和名称的展露机会,深化传播了企业的形象和品牌。手机APP提供的购物通道直接促进了销售。 不过,正如越来越多的企业选择整合营销模式一样,在媒体的应用和选择上,传统媒体、互联网、手机APP、PAD等多媒体组合营销正变得日益受宠。在传统广告、传统互联网与移动互联网融为一个整体的时候,企业和用户之间的关系通过APP应用联系在一起。 移动互联网,已成为当前信息产业当中发展最迅速、创新最活跃、竞争最激烈的领域,其引发了整个产业的性变革。中国在互联网上起步晚,却以迅猛的发展趋势,让世界看到中国对于新兴产业的发展和潜在实力,而在移动互联网上,中国与世界保持者同步的发展速度。而移动互联网APP应用也受到了越来越多的人关注。 我国在移动通信和互联网两大领域已经有了良好的基础,但是面向新的趋势,我国移动互联网的发展既面临后发赶超的机遇亦存在再次掉队的风险,迫切需要加强国家顶层设计,统筹和加快技术产业战略布局,落实行动计划,力争实现创新突破,建立技术产业优势,推动自主创新,构建发展新优势。同时需未雨绸缪,针对移动互联网产生的新的安全挑战重点布局。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务