谷歌推出的AppInventorAndroidApp开发工具可以让你仅通过拖拉式的简单 *** 作就可以创建自己的AndroidApp。对于那些为了特定目的想要动手尝试开发一个简单应用的用户。
android应用开发框架是ApplicationFramework其系统架构由5部分组成,分别是:LinuxKernel、AndroidRuntime、Libraries、ApplicationFramework、。第二部分将详细介绍这5个部分。下面自底向上分析各层。
Android架构
1、LinuxKernelAndroid
基于Linux26提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux
Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。
如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生
了变化不会影响到上层。也就是说各层各尽其职,各层提供固定的SAP(ServiceAessPoint),专业点可以说是高内聚、低耦合。
如果你只是做应用开发,就不需要深入了解LinuxKernel层。
2、AndroidRuntimeAndroid
包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己
的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是dex,dex格式是专为Dalvik
设计的一种压缩格式,适合内存和处理器速度有限的系统。
大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机
器指令更大。dx是一套工具,可以将Javaclass转换成dex
格式。一个dex文件通常会有多个class。由于dex有时必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。
Dalvik虚拟机依赖于Linux内核提供基本功能,如线程和底层内存管理。
3、LibrariesAndroid
包含一个C/C库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application
framework)暴露给开发者。下面列出一些核心库:系统C库--标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备
媒体库--基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、
H264、MP3、AAC、AMR、JPG、PNG界面管理--管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层
LibWebCore--新式的Web浏览器引擎,驱动Android浏览器和内嵌的web视图SGL--基本的2D图形引擎
3D库--基于OpenGLES10APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅FreeType
--位图和矢量字体渲染SQLite--所有应用程序都可以使用的强大而轻量级的关系数据库引擎
4、ApplicationFramework
通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。所有的应用程序其实是一组服务和系统,包括:视图(View)--丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器内容提供者(ContentProviders)--使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据资源管理器(ResourceManager)--提供访问非代码资源,如本地化字符串、图形和布局文件通知管理器(Manager)--使所有的应用程序能够在状态栏显示自定义警告活动管理器(ActivityManager)--管理应用程序生命周期,提供通用的导航回退功能
5、Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发!从上面我们知道Android的架构是分层的,非常清晰,分工很明确。Android本身是一套软件堆迭(Softwaretack),或称为「软件迭层架构」,迭层主要分成三层: *** 作系统、中间件、应用程序。从上面我们也看到了开源的力量,一个个熟悉的开源软件在这里贡献了自己的一份力量。
子窗口主菜单包括File Function Directory三个菜单项 分别用于完成文件的基本管理功能 其它管理功能和目录管理功能
由于对话框界面设计很简单 这里不再进行赘述 读者可直接参考后面将给出的对话框界面图(图 )进行设计
子窗口的创建 布置和关闭
子窗口的创建 布置由父窗口的Windows菜单控制 其菜单项如下
● New Windows : 创建新的子窗口
● Tile : 平铺
● Cascade : 层叠
● ArrangeIcon : 排列图标
● Minimized All : 极小化所有子窗口
子窗口的创建只需要简单调用窗体的Create方法
FileMan := TFMForm Create(Application)
子窗口的标准排列方式直接调用MDI窗口的标准方法Tile Cascade和ArrangeIcons
极小化所有子窗口的实现利用MDI窗口的两个属性 MDIChildCount和MDIChildren:
for i := to MDICount do
MDIChildren[i] Windowstate := wsMinimized;
子窗口关闭时释放内存空间 为此在子窗口TFMForm的OnClose事件中令
Action := OnFree;
为了保持和Windows的File Manager的一致性 我们也禁止关闭最后一个子窗口 这需要在子窗口的OnCloseQuery事件处理过程中实现
If FileManager MDIChildCount <= then
CanClose := False;
CanClose是OnCloseQuery事件过程返回的一个参数 用于判定窗口是否可以关闭
由于这一过程归子窗口所有 因而MDIChildCount前必须加上其对象名FileManager
但不幸的是 这样一来我们的程序无法终止了!原来MDI窗口关闭前首先关闭其所有的子窗口 如果子窗口不能关闭 MDI窗口也不能关闭
为此我们需要判断发出关闭消息的是子窗口的系统菜单还是菜单的Exit项
定义一个全局变量
var
ExitClick: Boolean;
在子窗口的Exit Click事件处理过程中
ExitClick := True;
FileManager Exit Click(Sender)
子窗口关闭前可以利用这一全局变量检测是否应关闭
If (FileManager MDIChildCount <= ) and (Not ExitClick) then
CanClose := False;
文件控件的联系
在本例中我们使用了一组新的控件 TabSet DirectoryOutline FileListBox 用于显示和选择驱动器 目录和文件 与( )中所用方法相比 使用这一组控件需要少量的代码支持
TabSet与DirectoryOutline的联系在TabSet的Click事件处理过程中建立
With DriveTabSet do
DirectoryOutline Drive := Tabs[TabIndex][ ];
DirectoryOutline与FileListBox的联系在DirectoryOutline的Change事件处理过程中建立
FileList Directory := DirectoryOutline Directory;
FileList Update;
DriveTabSet的自画风格显示
Dephi为一些控件提供了自画风格的显示 如ListBox ComboBox TabSet等 在缺省情况下 这些控件自动显示文本 而在自画风格下 拥有控件的窗体在运行时间内自己画出控件的每一项目
自画风格显示通常的应用是为项目除文本外再添加图形显示 能以自画风格显示的控件有一个共同特点 都拥有一个TStrings类型的项目链 由于TStrings类的特点(参第三章) 它们都可以加入一个和对应文本相联系的对象 而这正是自画风格显示的关键
通常情况下产生一个自画风格需要三个步骤
设置自画风格
向字符串链表添加图形对象
画出自画项目
设置自画风格
控件属性Style 用于设置自画风格 对于DriveTabSet 我们把Style 属性设置为tsOwnerDraw
对于ListBox ComboBox等控件的设置与TabSet略有差异 读者可参阅联机帮助文档
向字符串链表添加图形对象
在应用程序中添加部件
在本程序中我们设置了三个部件NetWork Floppy Fixed 并分别与三个位图文件NetWork bmp Floppy bmp Fixed bmp相关联
把添加到字符串链表中
根据字符串链表的性质 我们可以把对象与已存在的字符串建立联系 也可以同时添加字符串和对象 这里我们采用后一种方法
在子窗口的OnCreate事件处理过程中 我们利用一个循环依次检测从a到z的驱动器是否存在以及驱动器的类型 这利用了Windwos API函数GetDrivetype 如果驱动器不存在则返回 否则返回驱动器的类型(DRIVE_REMOVABLE DRIVE_FIXED DRIVE_REMOTE) 根据驱动器类型我们可以判断与文本(驱动器名)同时添加到Tabs中的不同图形对象 在添加过程中 DriveTabSet的TabIndex被设置为当前驱动器
程序清单如下
procedure TFMForm FormCreate(Sender: TObject)
var
Drive AddedIndex: Integer;
DriveLetter: Char;
begin
for Drive := to do
begin
DriveLetter := Chr(Drive + ord( a ))
case GetDrivetype(Drive) of
DRIVE_REMOVABLE:
AddedIndex := DriveTabSet Tabs AddObject(DriveLetter Floppy Picture Graphic)
DRIVE_FIXED:
AddedIndex := DriveTabSet Tabs AddObject(DriveLetter Fixed Picture Graphic)
DRIVE_REMOTE:
AddedIndex := DriveTabSet Tabs AddObject(DriveLetter Neork Picture Graphic)
end;
if UpCase(DriveLetter) = UpCase(FileList Drive) then
DriveTabSet TAbIndex := AddedIndex;
end;
end;
画出自画项目
当把一个控件的风格设置为自画时 Windows不再负责往屏幕上画出控件的项目 而是为每个可见项目产生自画事件 应用程序可以通过处理自画事件画出控件的项目
确定自画项目的大小
对于TabSet而言 这在OnMeasureTab事件处理过程中完成 我们需要把DriveTabSet每个标签的宽度增大到足以同时放下文本和位图
procedure TFMForm DriveTabSetMeasureTab(Sender: TObject; Index: Integer;
var TabWidth: Integer)
var
BitmapWidth: Integer;
begin
BitmapWidth := TBitmap(DriveTabSet Tabs Objects[Index]) Width;
Inc(TabWidth + BitmapWidth)
end;
由于TStrings的Objects属性中存放的对象都是TObject类型 并没有Width属性 因而需要再把它转化为TBitmap类型的对象
BitmapWidth := TBitmap(DriveTabSet Tabs Objects[Index]) Width;
返回目录 DELPHI基础教程
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
Java程序性能优化 让你的Java程序更快 更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
lishixinzhi/Article/program/Delphi/201311/25239
以上就是关于请问怎么做app开发全部的内容,包括:请问怎么做app开发、Android手机应用开发一般采用什么框架_安卓框架是什么、DELPHI基础教程:文件管理(二)[4]等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)