创新实践 安卓软件开发报告.docx
《创新实践 安卓软件开发报告.docx》由会员分享,可在线阅读,更多相关《创新实践 安卓软件开发报告.docx(20页珍藏版)》请在冰豆网上搜索。
![创新实践 安卓软件开发报告.docx](https://file1.bdocx.com/fileroot1/2023-2/6/6e33f52f-4b6e-41a8-b91d-670067bfc31d/6e33f52f-4b6e-41a8-b91d-670067bfc31d1.gif)
创新实践安卓软件开发报告
创新实践安卓软件开发报告
摘要
从没有比现在更好的时机,能通过为Android编写程序,将我们的创意带人生活中。
安卓AppStore给了我们巨大的机会,程序的开发也从未像如今这样简单和广泛。
你不仅能够拥有数百万的潜在客户还能拥有尖端的开发工具和硬件。
2008年Google推出了一款名为Android的开源智能手机操作系统,它采用Linux内核,开放手机联盟(OHA)成员可以任意使用和修改SDK包,系统的开源性使其具有良好的拓展性。
而很少受到早期手持设备的硬件和软件限制。
本设计在对Android开发有初步了解的情况下,设计一个有代表性的Android商业App,通过对商业实例的学习,了解真实项目的系统构架、引擎设计,了解声音、视频、图片处理等相关的编程技术要点、以便在实际的游戏项目开发中借鉴和综合应用这些知识。
关键字:
Android;APP;
1.3开发环境简介
JDK(JavaDevelopmentKit)是SunMicrosystems针对Java开发员的产品。
自从Java诞生以来,JDK已经成为最广泛的JavaSDK。
JDK是整个Java的核心内容,包括了Java运行环境、Java工具和Java基础类库三部分。
从Sun的JDK1.5开始,提供了一些非常使用的功能,其版本也不断更新,运行效率得到了非常大的提高。
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组建构建开发环境。
Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentKit,JDK)。
AndroidSDK即软件开发工具包(softwaredevelopmentkit)。
被软件开发工程师用于为特定的软件包、软件架构、硬件平台、操作系统等建立应用软件工具的集合。
因此AndroidSDK是Android专属的开发工具包。
其授权协议为Apache,开发语言为Java、需要Android操作系统的支持。
1.4开发环境搭建
下载安装Java开发包(JDK)。
选择“windowsofflineinstallation,multi-language”,根据屏幕提示完成安装。
打开计算机>点右键>属性>高级系统设置>环境变量,在系统变量中添加。
图1.1环境变量
新建JavaHome:
C:
\ProgramFiles\Java\jdk1.6.0_10,如图1.2。
图1.2JavaHome
新建CLASSPATH:
.;%JavaHome%\lib\dt.jar;%JavaHome%\lib\tools.jar;,如图1.3。
图1.3CLASSPATH
编辑Path,在变量值前添加:
%JavaHome%\bin;,如图1.4。
图1.4Path
在CMD窗体中输入java–version,如果屏幕出现如图1.5一样的代码信息,说明JDK安装成功了。
图1.5CMD窗体
1.4.2安装Eclipse
选择标有"eclipse IDE for java developers"的文件进行安装。
进入解压后的目录,就可以看到一个名为“eclipse.exe”的可执行文件,双击此文件直接运行,eclipse 能自动找到用户先期安装的JDK路径
1.4.3安装AndroidSDK
将下载的android-sdk压缩包解压为文件放于自选位置。
在Eclipse中选择Windows>Preferences>Android>Browse找到解压文件>Apply>OK。
打开环境变量,编辑Path,在变量值前添加:
C:
\java\adt-bundle-windows-x86-20130522\sdk\tools;,如图1.6。
图1.6Path
1.4.4ADT安装创建AVD
打开SDKManager.exe,选择tools>ManageAVDs,在AndroidVirtualDeviceManager中点击New,输入AVD的信息,点OK完成AVD的创建。
如图1.7。
图1.7AVD
2系统的设计与分析
2.1Android系统的概述
Android是一个包括操作系统,中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集。
作为一个层次结构的软件集,一定有一个层次的系统构架,下图为Android的构架图:
图2.1Android系统构架
2.1.1应用层
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。
所有的应用程序都是使用JAVA语言编写的。
2.1.2应用程序框架
开发人员也可以完全访问核心应用程序所使用的API框架。
该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。
同样,该应用程序重用机制也使用户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和系统,其中包括:
丰富而又可扩展的视图(Views),可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(textboxes),按钮(buttons),甚至可嵌入的web浏览器;内容提供器(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据:
资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串,图形,和布局文件(layoutfiles);通知管理器(NotificationManager)使得应用程序可以在状态栏中显示自定义的提示信息;活动管理器(ActivityManager)用来管理应用程序生命周期并提供常用的导航回退功能。
2.1.3系统运行库
系统运行库包括程序库和Android运行库。
首先是程序库, Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。
它们通过Android应用程序框架为开发者提供服务。
以下是一些核心库:
系统C库-一个从BSD继承来的标准C系统函数库(libc),它是专门为基于embeddedlinux的设备定制的;媒体库-基于PacketVideoOpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。
编码格式包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG;SurfaceManager-对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合;LibWebCore-一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图;SGL-底层的2D图形引擎;3Dlibraries-基于OpenGLES1.0APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速;FreeType-位图(bitmap)和矢量(vector)字体显示;SQLite-一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
其次是Android运行库,Android包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。
Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。
Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。
同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的"dx"工具转化成.dex格式由虚拟机执行。
Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
2.1.4Linux内核
Android的核心系统服务依赖于Linux2.6内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。
Linux内核也同时作为硬件和软件栈之间的抽象层。
2.3日历流程图
图2.2流程图
3系统详细设计
3.1日历其实是由3个预制的数据集组成
日历整个系统是由3个GridView组成,3个GridView分别预制当前月、上个月和下个月当发生滑动事件的时候产生替换,同时在加载时重新生成。
privateContextmContext=BaseCalendar.this;
privateGridViewtitle_gView;
privateGridViewgView1;//上一个月
privateGridViewgView2;//当前月
privateGridViewgView3;//下一个月
//privateGridViewgView1;
booleanbIsSelection=false;//是否是选择事件发生
privateCalendarcalStartDate=Calendar.getInstance();//当前显示的日历
privateCalendarcalSelected=Calendar.getInstance();//选择的日历
privateCalendarcalToday=Calendar.getInstance();//今日
privateCalendarGridViewAdaptergAdapter;
privateCalendarGridViewAdaptergAdapter1;
privateCalendarGridViewAdaptergAdapter3;
//顶部按钮
privateButtonbtnToday=null;
privateRelativeLayoutmainLayout;
//
privateintiMonthViewCurrentMonth=0;//当前视图月
privateintiMonthViewCurrentYear=0;//当前视图年
privateintiFirstDayOfWeek=Calendar.MONDAY;
privatestaticfinalintmainLayoutID=88;//设置主布局ID
privatestaticfinalinttitleLayoutID=77;//title布局ID
privatestaticfinalintcaltitleLayoutID=66;//title布局ID
privatestaticfinalintcalLayoutID=55;//日历布局ID
3.2视图的生成
生成一个主视图
//生成内容视图
privateViewgenerateContentView(){
//创建一个垂直的线性布局(整体内容)
viewFlipper=newViewFlipper(this);
viewFlipper.setId(calLayoutID);
mainLayout=newRelativeLayout(this);//创建一个垂直的线性布局(整体内容)
RelativeLayout.LayoutParamsparams_main=newRelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
mainLayout.setLayoutParams(params_main);
mainLayout.setId(mainLayoutID);
mainLayout.setGravity(Gravity.CENTER_HORIZONTAL);
LinearLayoutlayTopControls=createLayout(LinearLayout.HORIZONTAL);//生成顶部按钮布局
generateTopButtons(layTopControls);//生成顶部按钮(上一月,下一月,当前月)
RelativeLayout.LayoutParamsparams_title=newRelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
params_title.topMargin=5;
//params_title.addRule(RelativeLayout.ALIGN_PARENT_TOP,20);
layTopControls.setId(titleLayoutID);
mainLayout.addView(layTopControls,params_title);
calStartDate=getCalendarStartDate();
setTitleGirdView();
RelativeLayout.LayoutParamsparams_cal_title=newRelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
params_cal_title.addRule(RelativeLayout.BELOW,titleLayoutID);
//params_cal_title.topMargin=5;
mainLayout.addView(title_gView,params_cal_title);
CreateGirdView();
RelativeLayout.LayoutParamsparams_cal=newRelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
params_cal.addRule(RelativeLayout.BELOW,caltitleLayoutID);
mainLayout.addView(viewFlipper,params_cal);
LinearLayoutbr=newLinearLayout(this);
RelativeLayout.LayoutParamsparams_br=newRelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT,1);
params_br.addRule(RelativeLayout.BELOW,calLayoutID);
br.setBackgroundColor(getResources().getColor(R.color.calendar_background));
mainLayout.addView(br,params_br);
returnmainLayout;
}
3.3当所示日期发生选择变更是的视图更新
在主视图所示日期改变时更新,主要代码如下:
//根据改变的日期更新日历
//填充日历控件用
privatevoidUpdateStartDateForMonth(){
calStartDate.set(Calendar.DATE,1);//设置成当月第一天
iMonthViewCurrentMonth=calStartDate.get(Calendar.MONTH);//得到当前日历显示的月
iMonthViewCurrentYear=calStartDate.get(Calendar.YEAR);//得到当前日历显示的年
Strings=calStartDate.get(Calendar.YEAR)
+"-"
+NumberHelper.LeftPad_Tow_Zero(calStartDate
.get(Calendar.MONTH)+1);
btnToday.setText(s);
//星期一是2星期天是1填充剩余天数
intiDay=0;
intiFirstDayOfWeek=Calendar.MONDAY;
intiStartDay=iFirstDayOfWeek;
if(iStartDay==Calendar.MONDAY){
iDay=calStartDate.get(Calendar.DAY_OF_WEEK)-Calendar.MONDAY;
if(iDay<0)
iDay=6;
}
if(iStartDay==Calendar.SUNDAY){
iDay=calStartDate.get(Calendar.DAY_OF_WEEK)-Calendar.SUNDAY;
if(iDay<0)
iDay=6;
}
calStartDate.add(Calendar.DAY_OF_WEEK,-iDay);
}
privateCalendargetCalendarStartDate(){
calToday.setTimeInMillis(System.currentTimeMillis());
calToday.setFirstDayOfWeek(iFirstDayOfWeek);
if(calSelected.getTimeInMillis()==0){
calStartDate.setTimeInMillis(System.currentTimeMillis());
calStartDate.setFirstDayOfWeek(iFirstDayOfWeek);
}else{
calStartDate.setTimeInMillis(calSelected.getTimeInMillis());
calStartDate.setFirstDayOfWeek(iFirstDayOfWeek);
}
returncalStartDate;
}
publicclassTitleGridAdapterextendsBaseAdapter{
int[]titles=newint[]{R.string.Sun,R.string.Mon,R.string.Tue,
R.string.Wed,R.string.Thu,R.string.Fri,R.string.Sat};
privateActivityactivity;
//construct
publicTitleGridAdapter(Activitya){
activity=a;
}
@Override
publicintgetCount(){
returntitles.length;
}
@Override
publicObjectgetItem(intposition){
returntitles[position];
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
LinearLayoutiv=newLinearLayout(activity);
TextViewtxtDay=newTextView(activity);
txtDay.setFocusable(false);
txtDay.setBackgroundColor(Color.TRANSPARENT);
iv.setOrientation
(1);
txtDay.setGravity(Gravity.CENTER);
LinearLayout.LayoutParamslp=newLinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
inti=(Integer)getItem(position);
txtDay.setTextColor(Color.WHITE);
Resourcesres=getResources();
if(i==R.string.Sat){
//周六
txtDay.setBackgroundColor(res.getColor(R.color.title_text_6));
}elseif(i==R.string.Sun){
//周日
txtDay.setBackgroundColor(res.getColor(R.color.title_text_7));
}else{
}
txtDay.setText((Integer)getItem(position));
iv.addView(txtDay,lp);
returniv;
}
}
}
3.4启动和运行
当你点击运行程序是的加载代码
TextViewtxtDay=newTextView(activity);//日期
txtDay.setGravity(Gravity.CENTER_HORIZONTAL);
//判断是否是当前月
if(iMonth==iMonthViewCurrentMonth){
txtToDay.setTextColor(resources.getColor(R.color.ToDayText));
txtDay.setTextColor(resources.getColor(R.color.Text));
}else{
txtDay.setTextColor(resources.getColor(R.color.noMonth));
txtToDay.setTextColor(resources.getColor(R.color.noMonth));
}
i