




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖北大学本科课程设计(论文)湖北大学本科毕业论文(设计)题 目:移动端APP应用开发学 号:2012 2211 0421 0057姓 名:刘文迪专业年级:12级计科一班教师姓名:肖 蓉2015年 6 月 22 日目 录1.智能手机的发展历史12. Android架构12.1 架构图直观12.2 架构详解23. Android应用开发技术课程知识点总结43.1 Android Audio框架44. 手机淘宝系统开发84.1 首页84.1.1要点分析84.1.2核心源码84.1.3 运行效果114.2 搜索页114.2.1要点分析124.2.2核心源码144.2.3 运行效果144.3 登录页144.3.1要点分析154.3.2核心源码154.3.3 运行效果194.4订单页194.4.1要点分析194.4.2核心源码194.4.3 运行效果244.5小结255. APP开发技术的发展256. 致谢26参考文献27附录28 281. 智能手机的发展历史智能手机的发展史大致可分为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.1 Linux KernelAndroid基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各司其职,各层提供固定的SAP(Service Access Point),专业点可以说是高内聚、低耦合。如果你只是做应用开发,就不需要深入了解Linux Kernel层。2.2.2 Android RuntimeAndroid 包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己 的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统。大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。 两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以將 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有時必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。2.2.3 LibrariesAndroid包含一个C/C+库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库: 系统C库标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备 媒体库基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、 H.264、 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)提供访问非代码资源,如本地化字符串、图形和布局文件 通知管理器(NotificationManager)使所有的应用程序能够在状态栏显示自定义警告 活动管理器(ActivityManager)管理应用程序生命周期,提供通用的导航回退功能2.2.5 ApplicationsAndroid装配一个核心应用程序集合,包括电子邮件客户端、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 / Audio数据输出类型 / 省略部分内容 ; enum audio_format / Audio数据格式 FORMAT_DEFAULT = 0,PCM_16_BIT,PCM_8_BIT,INVALID_FORMAT; enum audio_mode / Audio模式 / 省略部分内容 ; enum audio_routes / 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,; / 省略部分内容 static status_t setMasterVolume(float value); 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);status_t start();status_t stop();ssize_t read(void* buffer, size_t size);/ 省略部分内容 AudioTrack和AudioRecord的read/write函数的参数都是内存的指针及其大小,内存中的内容一般表示的是Audio的原始数据(PCM数据)。这两个类还涉及Auido数据格式、通道数、帧数目等参数,可以在建立时指定,也可以在建立之后使用set()函数进行设置。在libmedia库中提供的只是一个Audio系统框架,AudioSystem、AudioTrack和AudioRecord分别调用下层的IAudioFlinger、IAudioTrack和IAudioRecord来实现。另外的一个接口是IAudioFlingerClient,它作为向IAudioFlinger中注册的监听器,相当于使用回调函数获取IAudioFlinger运行时信息。2. 手机淘宝系统开发4.1 首页4.1.1要点分析首页应该注意两点:接受和发送数据不能出现数据的阻塞,不容就会出现闪退的情况;首页相当于整个app的脸面,所以首页的UI设计非常重要,另外还要考虑app的页面要适应不同大小的屏幕,否则客户体验度就会急剧下降。4.1.2核心源码/初始化手机信息数据 private Boolean inintInfo(int num) Id = new Stringnum; Brands = new Stringnum; Price = new Stringnum; Name = new Stringnum; Nettype = new Stringnum; Cpu = new Stringnum; Ram = new Stringnum; BCamera = new Stringnum; Screesize = new Stringnum; Battery = new Stringnum; ImgUrl=new Stringnum; 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,protocol error:+e.getMessage();solveNoConnection(); catch (IOException e)System.out.println(IO error:+e.getMessage();e.printStackTrace();Log.d(check,IO error:+e.getMessage();solveNoConnection();return strResult; /网络请求错误时执行private Boolean solveNoConnection()connectRight=false;Log.d(check,网络请求错误处理!);state.setText(无网络或网络访问失败!);return true;/ 普通Json数据解析private void parseJson(String strResult)tryJSONObject jsonObj = new JSONObject(strResult);int count=Integer.parseInt(jsonObj.getString(num).toString();Count=count;inintInfo(count);Log.d(check,parseJson:+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;icount;i+)Idi=PhoneId.getString(i).toString();Brandsi=brands.getString(i);Pricei=price.getString(i);Namei=name.getString(i);Nettypei=nettype.getString(i);Cpui=cpu.getString(i);Rami=ram.getString(i);BCamerai=bCamera.getString(i);Screesizei=screesize.getString(i);Batteryi=battery.getString(i);ImgUrli=HomeUrl+imgUrl.getString(i);Log.d(check, parseJson获取图片地址:+ImgUrli); catch (JSONException e)System.out.println(Json parse error:+e.getMessage();Log.d(check, Json parse error:+e.getMessage();state.setText(Json parse error:+e.getMessage();e.printStackTrace();4.1.3 运行效果图4.1.3-14.2 搜索页4.2.1要点分析搜索页的核心点在于webService的接口要设计好,接受数据和发送数据的接口都要精心设计,尤其要注意缓冲模块的设计,否则容易出现数据阻塞。在从webService获取数据时,要考虑好对异常情况的处理,如果异常情况没处理好,app运行到这里就会出现闪退的情况。4.2.2核心源码/初始化手机信息数据 private Boolean inintInfo(int num) Id = new Stringnum; Brands = new Stringnum; Price = new Stringnum; Name = new Stringnum; Nettype = new Stringnum; Cpu = new Stringnum; Ram = new Stringnum; BCamera = new Stringnum; Screesize = new Stringnum; Battery = new Stringnum; ImgUrl=new Stringnum; 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,protocol error:+e.getMessage();solveNoConnection(); catch (IOException e)System.out.println(IO error:+e.getMessage();e.printStackTrace();Log.d(check,IO error:+e.getMessage();solveNoConnection();return strResult; /网络请求错误时执行private Boolean solveNoConnection()Log.d(check,网络请求错误处理!);searchState.setText(无网络或网络访问失败!);return true;/ 普通Json数据解析private void parseJson(String strResult)tryJSONObject jsonObj = new JSONObject(strResult);int count=Integer.parseInt(jsonObj.getString(num).toString();Count=count;inintInfo(count);Log.d(check,parseJson:+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);JSO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一快乐活动方案
- 六一教室活动方案
- 六一晨间游戏活动方案
- 六一活力节目活动方案
- 六一活动公司活动方案
- 六一活动呼啦圈活动方案
- 六一活动拍球活动方案
- 六一活动联盟活动方案
- 六一活动集体街舞活动方案
- 六一涮锅活动方案
- 宠物中医理疗保健(山东畜牧兽医职业学院)知到智慧树答案
- 解除劳务合同的协议书
- 医学细胞生物学(温州医科大学)知到智慧树章节答案
- 2024年度股权转让款退款合同3篇
- 生产车间关键岗位培训
- 精益六西格玛黄带认定考试题库及答案
- 2019年湖北宜昌中考满分作文《我向往麦穗一样的人生》
- (资料)某县二次供水改造可行性研究报告
- 电气自动化工程师自学宝典阅读笔记
- (1000题)中级消防设施操作员模拟试题及答案
- (正式版)JB∕T 14730-2024 辊底式连续退火炉热处理技术要求
评论
0/150
提交评论