计算机科学与技术毕业实习报告.docx
《计算机科学与技术毕业实习报告.docx》由会员分享,可在线阅读,更多相关《计算机科学与技术毕业实习报告.docx(16页珍藏版)》请在冰豆网上搜索。
计算机科学与技术毕业实习报告
西南科技大学计算机学院
本科(毕业)校外实习报告
院(系):
计算机科学与技术专业班级:
计算机1104学生姓名:
学长
学号:
20111639
成绩:
指导老师:
高小明提交日期:
一、实习的目的和意义毕业实习是学生大学本科教学实践的主要环节,对学生的实践能力的培养具有十分重要的意义。
学生通过本次实习,能够了解计算机专业的相关新技术,了解理论知识在实际应用中的作用,了解计算机技术的新发展,体验计算机专业的工作内容和工作特点,拓宽知识面,增强人际沟通能力,加强团队协作精神,为走向社会打下基础。
Android以Linux为核心的Android运行平台,使用Java作为编程语言。
本次实习是在学习java语言程序设计的基础上进行的一次综合实践。
通过综合训练,要求学生掌握java语言程序设计的基本技能和Android编程的应用,并较系统地掌握JAVA语言程序设计开发方法以及帮助文件的使用等,使学生通过本次实训,能够进行独立的Android应用程序开发,能够在实际操作中得到进一步的提高,为以后的学习和工作打下良好的基础。
1.1实习目的
1.了解公司,熟悉办公流程及环境
2.培养学生运用所学课程Java语言程序设计的理论知识和技能,分析解决计算机实际应用中的问题的能力。
3.培养学生在Java语言程序设计的基础上,开发Android应用程序的思想和方法。
4.培养学生调查研究、查阅技术文献、资料、手册以及编写技术文献的能力。
5.掌握MTKAndroid源码
1.2实习意义
1.锻炼自己的动手能力,将学习的理论知识运用于实践当中,反过来检验书本上理论的正确性。
将自己的理论知识与实践融合,进一步巩固、深化已经学过的理论知识,提高综合运用所学过的知识,并且培养自己发现问题、解决问题的能力,
加强对市场营销过程的认识;
2•更广泛的直接接触社会,了解社会需要,加深对社会的认识,增强对社会的适应性,将自己融合到社会中去,培养自己的实践能力,缩短我们从一名大学生到一名工作人员之间的思想与业务距离。
为以后进一步走向社会打下坚实的基础;
3.了解公司部门的构成和职能,整个工作流程,从而确立自己在公司里最擅长的
工作岗位。
为自己未来的职业生涯规划起到关键的指导作用。
二、实习内容
2.1系统学习java语言
(1)Java语言特点
•面向对象:
与C++相比,JAVA是纯的面向对象的语言,C++为了向下兼容C,保留了很多C里面的特性,而C,众所周知是面向过程的语言,这就使C++成为一个"混血儿"。
而JAVA语法中取消了C++里为兼容C所保留的特性,如取消了头文件、指针算法、结构、单元等。
•可移植(平台无关性):
生成中间字节码指令,与其他编程语言不同,Java并不生成可执行文件(.exe文件),而是生成一种中间字节码文件(.class文件)。
任何操作系统,只要装有Java虚拟机(JVM),就可以解释并执行这个中间字节码文件。
这正是Java实现可移植的机制
-原始数据类型存储方法固定,避开移植时的问题
Java的原始数据类型的大小是固定的。
比如,在任何机器上,整型都是32位,而C++里整型是依赖于目标机器的,对16位处理器(比如8086),整数用两个字节表示;在像SunSPARC这样的32位处理器中,整数用4个字节表示。
在IntelPentium处理器上,整数类型由具体的操作系统决定:
对于DOS和Win32来说,整数是2个字节;对于Windows9x、NT和2000,整数是4个字节。
当然,使整数类型平台无关之后,性能必然有所下降,但就Java来说,这个代价是值得的。
Java的字符串,则采用标准的Unicode格式保存。
可以说,没有这个特性,Java的可移植性也不可能实现。
•AVA在语法上与C++类似
JAVA的语法与C++很接近,有过C或者C++编程经验的程序员很容易就可以学会JAVA语法;
•取消了C++的一些复杂而低效的特性比如:
用接口技术代替了C++的多重继承。
C++中,一个类允许有多个超类,这个特性叫做"多重继承",多重继承使得编译器非常复杂且效率不高;JAVA的类只允许有一个超类,而用接口
(Interface)技术实现与C++的多继承相类似的功能
其它被取消的特性包括:
虚拟基础类、运算符过载等
JAVA的基本解释器和类支持模块大概仅40K
即使加入基本的标准库和支持线程的模块,也才220K左右。
与GUI(图形用户界面)相比,明显小很多
•取消了指针算法
C的最关键的一个特性是它的强大指针算法,比如可以用指针访问字符串、数组甚至文件,很容易产生指针溢出,意外地改写内存和损毁数据。
JAVA里有一个指针模型,对于普通的任务,如访问字符串、数组,根本不用指针,而一旦需要,比如访问对象、文件时,也可以获得指针的强大能力,但JAVA同时有高度的指针安全保障,用户永远不可能访问一个坏掉的指针、不可能造成内存分配错误,也用不着专门提防可能出现的内存漏洞。
•强大的多线程能力
多线程可以使程序有更好的交互性和实时性,并可以最大限度地利用多处理器系统。
JAVA有着强大的多线程处理能力,因为各主流操作系统平台在线程的实施方面有重大的差异,所以JAVA为不同的操作系统实现了专门的多线程机制。
在这点上来说,JAVA没有做到平台无关。
(2)面向对象基础
static称为静态修饰符,它可以修饰类中的属性和方法。
1.静态属性
被static修饰的属性称为静态属性,这类属性一个最本质的特点是:
它们是类的属性,而不属于任何一个类的具体对象。
换句话说,对于该类的任何一个具体对象而言,静态属性是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值,同样任何一个类的对象去修改它时,也都是在对同一个内存单元做操作。
静态属性节省空间;静态属性保持类对象的一致性修改举例:
总和、基本工资等
2.静态方法
static修饰符修饰的属性是属于类的公共属性:
与之相仿,用static修饰符修饰的方法,是属于整个类的类方法;而不用static至少有三重含义:
(1)调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名;
(2)非static的方法是属于某个对象的方法,在这个对象创建时对象的方法在内存中拥有自己专用的代码段;而static的方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有:
(3)由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量。
也即,static方法只能处理static的数据。
3.静态初始化器
静态初始化器是由关键字static引导的一对大括号括起的语句组。
它的作用与类的构造函数有些相似,都用来完成初始化的工作,但是静态初始化器与构造函数有三点根本的不同:
(1)构造函数是对每个新创建的对象初始化,而静态初始化器是对每个类进行初始化;
(2)构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用运行的;
(3)不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数列表。
让我们考虑如下的问题,所以考虑由系统自动为新雇员对象生成编号变量的值,将Employee类的属性定义改写为:
classEmployee//定义雇员类
{
privatedoublem_EmpSalary;
staticdoublem_MinSalary;
staticintm_NextEmpNo;
}
构造函数为:
Employee(Stringname,charsex,doublesal)
//构造函数,完成初始
化工作
{
m_EmpNo=m_NextEmpNo++;//新雇员使用了新编号之后,再产生另一个新编号
m_EmpName=newString(name);
m_EmpGender=sex;
if(sal>=m_MinSalary)//工资额不合理时使用最低工资m_EmpSalary=sal;
else
m_EmpSalary=m_MinSalary;
这里,为实现编号不重复地自动生成,引入一个类成员m_NextEmpNo,它的值是下一个新创建的雇员对象的编号。
每当有新对象生成时,系统调用构造函数,将m_NextEmpNo的当前值赋给新雇员的编号变量m_EmpNo,然后让类静态属性m_NextEmpNo自动加一,这样新对象的编号就不会与已有对象的编号相重复。
表面看来整个问题似已解决,但实际上还有很关键的一步没有完成:
那就是static的类属性m_NextEmpNo的初始化问题。
总之,静态初始化器的作用是对整个类完成初始化操作,包括给static类成员赋初值等,它在系统向内存加载时自动完成。
(3)java线程基础
一、线程概述
线程是程序运行的基本执行单元。
当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来作为这个程序运行的入口点。
因此,在操作系统中运行的任何程序都至少有一个主线程。
进程和线程是现代操作系统中两个必不可少的运行模型。
在操作系统中可以有多个进程,这些进程包括系统进程(由操作系统内部建立的进程)和用户进程(由用户程序建立的进程);一个进程中可以有一个或多个线程。
进程和进程之间不共享内存,也就是说系统中的进程是在各自独立的内存空间中运行的。
而一个进程中的线可以共享系统分派给这个进程的内存空间。
线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。
注意:
任何一个线程在建立时都会执行一个函数,这个函数叫做线程执行函数。
也可以将这个函数看做线程的入口点(类似于程序中的main函数)。
无论使用什么语言或技术来建立线程,都必须执行这个函数(这个函数的表现形式可能不一样,但都会有一个这样的函数)。
如在Windows中用于建立线程的API函数CreateThread的第三个参数就是这个执行函数的指针。
在操作系统将进程分成多个线程后,这些线程可以在操作系统的管理下并发执行,从而大大提高了程序的运行效率。
虽然线程的执行从宏观上看是多个线程同时执行,但实际上这只是操作系统的障眼法。
由于一块CPU同时只能执行一条指令,因此,在拥有一块CPU的计算机上不可能同时执行两个任务。
而操作系统为了能提高程序的运行效率,在一个线程空闲时会撤下这个线程,并且会让其他的线程来执行,这种方式叫做线程调度。
我们之所以从表面上看是多个线程同时执行,是因为不同线程之间切换的时间非常短,而且在一般情况下切换非常频繁。
假设我们有线程A和B。
在运行时,可能是A执行了1毫秒后,切换到B后,B又执行了1毫秒,然后又切换到了A,A又执行1毫秒。
由于1毫秒的时间对于普通人来说是很难感知的,因此,从表面看上去就象A和B同时执行一样,但实际上A和B是交替执行的。
二、线程给我们带来的好处
如果能合理地使用线程,将会减少开发和维护成本,甚至可以改善复杂应用程序的性能。
如在GUI应用程序中,还以通过线程的异步特性来更好地处理事件;在应用服务器程序中可以通过建立多个线程来处理客户端的请求。
线程甚至还可以简化虚拟机的实现,如Java虚拟机(JVM)的垃圾回收器(garbagecollector)通常运行在一个或多个线程中。
因此,使用线程将会从以下五个方面来改善我们的应用程序:
1.充分利用CPU资源现在世界上大多数计算机只有一块CPU。
因此,
充分利用CPU资源显得尤为重要。
当执行单线程程序时,由于在程序发生阻塞时CPU可能会处于空闲状态。
这将造成大量的计算资源的浪费。
而在程序中使用多线程可以在某一个线程处于休眠或阻塞时,而CPU又恰好处于空闲状态时来运行其他的线程。
这样CPU就很难有空闲的时候。
因此,CPU资源就得到了充分地利用。
2.简化编程模型如果程序只完成一项任务,那只要写一个单线程的程序,并且按着执行这个任务的步骤编写代码即可。
但要完成多项任务,如果还使用单线程的话,那就得在在程序中判断每项任务是否应该执行以及什么时候执行。
如显示一个时钟的时、分、秒三个指针。
使用单线程就得在循环中逐一判断这三个指针的转动时间和角度。
如果使用三个线程分另来处理这三个指针的显示,那么对于每个线程来说就是指行一个单独的任务。
这样有助于开发人员对程序的理解和维护。
3.简化异步事件的处理当一个服务器应用程序在接收不同的客户端连接时最简单地处理方法就是为每一个客户端连接建立一个线程。
然后监听线程仍然负责监听来自客户端的请求。
如果这种应用程序采用单线程来处理,当监听线程接收到一个客户端请求后,开始读取客户端发来的数据,在读完数据后,read方法处于阻塞状态,也就是说,这个线程将无法再监听客户端请求了。
而要想在单线程中处理多个客户端请求,就必须使用非阻塞的Socket连接和异步I/O。
但使用异步I/O方式比使用同步I/O更难以控制,也更容易出错。
因此,使用多线程和同步I/O可以更容易地处理类似于多请求的异步事件。
4.使GUI更有效率使用单线程来处理GUI事件时,必须使用循环来对随时可能发生的GUI事件进行扫描,在循环内部除了扫描GUI事件外,还得来执行其他的程序代码。
如果这些代码太长,那么GUI事件就会被“冻结”,直到
这些代码被执行完为止
在现代的GUI框架(如SWING、AWT和SWT)中
都使用了一个单独的事件分派线程(eventdispatchthread,EDT)来对GUI事件进行扫描。
当我们按下一个按钮时,按钮的单击事件函数会在这个事件分派线程中被调用。
由于EDT的任务只是对GUI事件进行扫描,因此,这种方式对事件的反映是非常快的。
5.节约成本
提高程序的执行效率一般有三种方法:
(1)增加计算机的CPU个数。
(2)为一个程序启动多个进程
(3)在程序中使用多进程。
第一种方法是最容易做到的,但同时也是最昂贵的。
这种方法不需要修改程序,从理论上说,任何程序都可以使用这种方法来提高执行效率。
第二种方法虽然不用购买新的硬件,但这种方式不容易共享数据,如果这个程序要完成的任务需要必须要共享数据的话,这种方式就不太方便,而且启动多个线程会消耗大量的系统资源。
第三种方法恰好弥补了第一种方法的缺点,而又继承了它们的优点。
也就是说,既不需要购买CPU,也不会因为启太多的线程而占用大量的系统资源(在默认情况下,一个线程所占的内存空间要远比一个进程所占的内存空间小得多),并且多线程可以模拟多块CPU的运行方式,因此,使用多线程是提高程序执行效率的最廉价的方式。
2.2系统学习Android语言
2.2.1历史背景:
2007年11月5日,Google发布基于Linux平台的开源移动手机平台—
—Android。
该平台由操作系统、中间件、用户界面和应用软件等组成,号称是首个为移动终端打造的真正开放的移动开发平台。
2008年9月22日,美国运营商TMobileUSA在纽约正式发布第一款Google手机——T-MobileG1。
该款手机为中国台湾HTC(宏达电)代工制造,是世界上第一部使用Android
操作系统的手机,支持WCDMA/HSPA网络,理论下载速率为7.2Mbit/s,并支持Wi-Fi无线局域网络。
Android的特性Android的主要特性如下:
•应用程序框架,支持组建的重用与替换。
•Dalvik虚拟机,专门为移动设备做了优化。
•内部集成浏览器,该浏览器基于开源的WibKit引擎。
•优化的图形库,包括2D和3D图形库,3D图形库基于OpenGLES1.0(硬件加速可选)。
•SQLite数据库,是一套开放性源代码的关系型数据库,其特点在于轻量级的设计结构,更适合在手机上使用。
•GSM电话(依赖于硬件)。
•蓝牙(Bluetooth),EDGE,3G和Wi-Fi(依赖于硬件)。
•多媒体支持,包括常见的音频、视频和静态图像文件格式。
•照相机、GPS、指南针和加速度计等丰富的传感器(依赖于硬件)。
•丰富的开发环境,包括设备模拟器、调试工具、内存及性能分析图表,以及Eclipse集成开发环境插件。
1)程序应用
Android连同一个核心应用程序包发布,该应用程序包括E-mail客户端、
SMS短消息程序、日历、地图、浏览器、联系人管理程序等。
所以的应用程序
都是用Java编写的。
2)应用程序框架
开发者完全可以访问核心应用程序所使用的API框架。
该应用程序框架架构用来简化组件的软件的重用,任何一个应用程序都可以发布它的模块功能并且任何其他的应用程序都可以使用其所发布的功能块(不过要遵循框架的安全性限制)。
该应用程序重用机制使得组件可以被用户替换。
以下所有的应用程序都由一系列的服务和系统组成,包括:
1.一个可扩展的视图(Views)可以用来创建应用程序,包括列表(lists)、网络(grids)、文本框(textboxes)、按钮(buttons),甚至是一个可嵌入的Web浏览器。
2.内容管理器(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。
3.一个资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串、图形和分层文件(layoutfiles)。
4.一个通知管理器(NotificationManager)使得应用程序可以在状态栏中显示客户通知信息。
5.一个活动类管理器(ActivityManager)用来管理应用程序生命周期并提供常用的导航回退功能。
3)Android程序库
Android包括一个被Android系统中各种不同组件所使用的C/C++集库。
该库通过Android应用程序框架为开发者提供服务。
以下是一些主要的核心库:
1.系统C库:
一个从BSD继承来的标准C系统函数库(libc),专门为基于EmbeddedLinux的设备定制
2.媒体库:
基于PacketVideoOpenCORE;该库支持录放,并且可以录制许多流行的音频视频格式,还有静态映像文件包括MPEG4、H.264、MP3、AAC、JPG、PNG。
3.SurfaceManager:
对显示子系统的管理,并且为多个应用程序提供2D和3D图层的无缝融合。
4.LibWebCore:
一个最新的Web浏览器引擎,用来支持Android浏览器和一个可嵌入的Web视图。
5.SGL:
—个内置的2D图形引擎。
6.3Dlibraries:
基于OpenGLES1.0APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。
7.FreeType:
位图(bitmap)和向量(vector)字体显示。
8.SQLite:
—个对于所以应用程序可用、功能强劲的轻型关系型数据库引擎。
4)Android运行库
Android包括了一个核心库,该核心库提供了Java编程语言核心库的大多数功能。
每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。
Dalvik是针对同时高效地运行多个VMs实现的。
Dalvik虚拟机执行.dex的Dalvik可执行文件,该格式文件针对最小内存使用做了优化。
该虚拟机是基于寄存器的,所有的类都是经由Java汇编器编译,然后通过SDK中的DX工具转化成.dex格式由虚拟机执行。
Dalvik虚拟机依赖于Linux的一些功能,比如线程机制和底层内存管理机制。
5)Linux内核
Android的核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。
Linux内核也同时作为硬件和软件之间的硬件抽象层。
6)service以及service的生命周期
两种用处:
后台运行和跨进程访问
两种模式:
startService()/bindService()
模式场合:
调用者与服务之间没有关连,即使调用者退出了,服务仍然运行即用startService(),调用者与服务绑定在了一起,调用者一旦退出,服务也就终止则用bindService()生命周期:
service的生命周期没有像activity里的onstop,主要经历创建、开始、销毁三个阶段,由于有两种模式的存在,其生命周期有两种体现方式
如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法,如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。
采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。
该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用onDestroy()方法。
2.3系统学习Github知识
Git是一个分布式的版本控制系统,最初由LinusTorvalds编写,用作Linux内核代码的管理。
在推岀后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中。
目前,包括Rubinius、
Merb和Bitcoin在内的很多知名项目都使用了Git。
Git同样可以被诸如Capistrano和VladtheDeployer这样的部署工具所使