第2讲 移动终端与操作系统
移动终端的作用
- 移动终端是实现移动互联的前提和基础。
- 移动终端已经具备较强的计算、存储和处理能力以及触摸屏、定位、视频摄像头等功能组件。
- 移动终端拥有智能的操作系统和开放的软件平台。
- 采用智能操作系统的移动互联网终端,除了具备短信和通话功能外,还具有网络扫描、接口选择、蓝牙I/O、后台处理、能量监控、节能控制、低层次内存管理、持久存储和位置感知功能。
- 上述功能使得移动终端在医疗卫生、社交网络、环境监控、交通管理等领域等得到越来越多的应用。
第一部分、移动终端的组成:
1.移动互联网终端的硬件组成
(1)数字基带处理器:选择适当的移动通信网络,建立和维持网络连接,实现话音和数据通信,一般采用DSP实现
(2)应用处理器:采用嵌入式操作系统,加载多种应用协议以提供各种服务
(3)射频模块:无线信号接收和发射的放大
(4)电源管理部分
2.移动互联网硬件技术
五大类技术:
- 芯片组技术
- 屏幕技
- 显示屏技术
- 触屏技术
- 电池技术
- 充电技术
- 电池技术
- 传感器技术
- 摄像头技术
(1)芯片组
- 基带处理器向更高速率演进。
- 支持多种通信协议(HSPA+/LTE/EV-DO等),满足3G/4G/5G等多制式需要。
- 应用处理器部分,延续ARAM演进路线,向多核及更高处理频率、集成专业图形处理芯片、支持更多硬件架构和标准化接口方向演进。
- 移动芯片组向多芯片组发展,主流芯片将采用28nm及更好的工艺,减小功耗,提高集成度。
总体来说,高集成度、高速率、支持多种操作系统、多制式以及低功耗将是未来的发展方向。
(2)屏幕技术
屏幕技术:对屏幕评价,可从屏幕颜色、屏幕材质和屏幕尺寸三个方面进行。
- 显示屏技术
- 背光源演进:节电、长寿命、快速反应。
- 驱动方式演进:实现像素独立控制、提高反应速度、精确控制灰度。
- 显示分类演进:更大视角、更高亮度和更薄的厚度。
触屏技术
- 透射式电容屏技术:单片玻璃方案(Touch on Lens)、On-cell方案(三星)和In-cell方案(LG等)。
- 用户体验角度看,软性屏幕、触感压力、红外输入和电磁笔是交互方式的未来演进方向。
整体看,显示屏的发展方向是更大尺寸、高清、低功耗、更好的显示技术以及更加精确的人性化输入。
(3)传感器技术
传感器技术:是向用户提供更多功能的基础。
- 加速度感应器:提供高精度、提供更加准确的信息。
- 陀螺仪:支持3D UI、旋转UI等操作。
- 除了光线感应器、距离感应器和重力感应器等传统的主流感应器外,更多的感应器如化学感应器、气压感应器等将逐步出现在移动终端上,推动移动终端向向全感知的方向发展。
(4)摄像头技术
摄像头技术:更低噪声、更高像素是发展的主线,还将具有可变光圈(依据光线自动调节光圈)、红外摄像等功能。
(5)电池技术
电池技术:续航能力是关键,没有更长的续航时间,就无法为用户提供更好的移动互联网体验。锂电、太阳能电池、无线充电和燃料充电、动力充电等都是电池技术未来发展的方向。
3.移动互联网软件技术
操作系统是基础
基础中间件、业务中间件、通信中间件实现应用支撑
-
- 本地应用
- Web应用
系统闭源/封闭文件管理系统/接口开放模式:以IOS为代表,系统不开放源码,也不提供本地文件系统功能,提供开放的接口,可以供第三方进行应用开发。
用户获得最稳定、安全的应用程序,为第三方盈利提供了良好的基础,用户只能从固定渠道下载应用,通过不同方式管理不同类多媒体文件。
系统闭源/开放文件管理系统/接口开放模式:以Windows Mobile为代表,系统不开放源码,提供本地文件系统功能,提供开放的接口,可以供第三方进行应用开发。
可多渠道下载应用,操作系统可选择认证或不认证,灵活性高,不认证容易出现安全性问题。
系统开源/开放文件管理系统/接口开放模式:以Android和Windows CE为代表,系统开放或部分开放源码,提供本地文件系统功能,提供开放的接口,可以供第三方进行应用开发。
可进行深度定制,可满足不同用户需要,系统版本分化,易出现兼容性问题。
三种模式同时演进,总体上看,在保持灵活性的基础上尽量避免版本分化、增强系统对应用的认证及更深度开放API,将是操作系统未来发展的方向。
4.移动终端硬件
- 芯片组:高集成度、高速率、支持多种操作系统、多制式以及低功耗将是未来的发展方向。
- 显示器:显示屏的发展方向是更大尺寸、高清、低功耗、更好的显示技术以及更加精确的人性化输入。
- 传感器:全感知方向发展。
- 摄像头:更低噪声、更高像素是发展的主线,还将具有可变光圈(依据光线自动调节光圈)、红外摄像等功能。
- 电池:续航能力是关键。锂电、太阳能电池、无线充电和燃料充电、动力充电等都是电池技术未来发展的方向。
5.移动终端软件
- 操作系统:操作系统是基础
- 系统闭源/封闭文件管理系统/接口开放模式
- 系统闭源/开放文件管理系统/接口开放模式
- 系统开源/开放文件管理系统/接口开放模式
- 避免版本分化、增强系统对应用的认证及更深度开放API,将是操作系统未来发展的方向
- 中间件:基础中间件、业务中间件、通信中间件实现应用支撑
- 应用软件:本地应用和web应用
第二部分、Android操作系统
什么是Android?
- Android是一种以Linux为基础的开放源码操作系统,主要用于便携设备。
- Android是Google于2007年11月5日宣布的基于Linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成。
(一)Android的体系构架
1.Android的体系架构
- 应用层。由运行在Dalvik虚拟机上的应用程序(主要由Java语言编写)组成,例如日历、地图、浏览器、联系人管理等。
Dalvik虚拟机是Google为Android专门设计的基于寄存器的Java虚拟机,运行Java程序的速度比JVM更快。
2.框架层。主要由View、通知管理器(Notification Manager)、活动管理器(Activity Manager)等由开发人员直接调用的API组成(这些API主要也由Java语言编写)。
3.系统运行库层。对框架层提供支持。通过Java访问硬件,必须使用NDK(native Development Kit)。
NDK是一些由C/C++语言编写的库(主要是.so文件),这些库是系统运行库层的组成部分,该层还包括C语言标准库、多媒体库、OpenGL ES、SQLite、Webkit、Dalvik虚拟机等。
4.Linux内核层。主要包括驱动、内存管理、进程管理、网络协议栈等组件。
2.Android的应用类型
3.Android的应用程序框架-框架层组件
主要指应用开发中所使用的Android SDK中类、接口的集合
- android.app:程序模型和基本运行环境(Application、Activity、Fragment、Service等)
- android.appwidget:窗口小部件(Widget)的创建与管理
- android.bluetooth:蓝牙设备管理与适配
- android.content:内容管理、获得与发布
- android.database:数据库操作与管理
- android.drm:内容数字版权与加密保护
- android.gesture:触摸及手势操作
- android.graphics:底层图形库,包括画布、颜色过滤、点、矩形等,可以将其直接绘制到屏幕上,还包括PDF文档的生成和动画等
- android.hardware:硬件管理与操作,包括相机、传感器、显示、指纹、输入设备和USB设备等
- android.icu:国际化语言组件
- android.inputmethodservice:输入法服务组件
- android.location:位置服务组件,包括地理坐标、GPS、位置等
- android.media:音视频资源管理与访问组件
- android.mtp:媒体传输协议
- android.net:网络管理与服务组件,包括HTTP、网络服务发现(NSD)、实时传输协议(RTP)、网络电话、wifi发现与管理
- android.nfc:NFC设备的适配与管理服务组件
- android.opengl:OpenGL工具类
- android.os:系统服务组件,包括电池管理、存储管理、消息传输等
- android.preference:偏好或首选项管理组件
- android.print:打印管理组件,包括PDF打印
- android.printservice:打印服务
- android.provider:内容提供者,包括日历、联系人、媒体库、电话等
- Android.renderscript :高效计算和快速渲染组件
- android.sax:XML访问组件
- android.security:安全和秘钥管理组件
- android.sevice:服务组件,包括语音、媒体、VR等服务组件
- android.speech:包括语音识别和文本转语音等
- android.system:系统组件
- android.telcom:通信组件
- android.telephony:与拨打电话相关
- android.test:用于测试android应用程序的框架
- android.text:文本组件,包括文本格式和相关实用组件
- android.transition:转场动画、变换动画和连贯性交互
- android.util:实用工具类
- android.view:基础的用户界面接口框架
- android.webkit:默认的浏览器内核操作接口
- android.widget:包含android SDK提供的大部分UI控件
4.Android的四大应用程序组件
- Activity:应用程序入口;界面显示,接收事件,控制显示跳转。
- BroadcastReceiver:用于注册和接收系统广播的事件;接收自定义广播事件。
- ContentProvider:提供数据库查询接口;对外(也就是“其他应用程序”)公开数据查询服务。
- Service:独立进程,可一直在后台运行;可以与其他组件(如Acitivity、Service、ContentProvider)通过远程连接绑定进行交互;可对外提供服务交互接口;生命周期不依赖于其他组件。
5.Activity
(1)Activity状态
-
- 激活或运行状态:当Activity在屏幕前台时(位于当前任务堆栈的顶部),处于激活或运行状态。
- 暂停状态:当Activity上面有另外一个Activity,上面的Activity没有完全覆盖它或透明,下方的Activity仍然对用户可见,处于暂停状态,并且是存活状态(保留所有的状态和成员信息并保持和窗口管理器连接),系统内存不足时会杀死这个Activity。
- 停止状态:当Activity完全被另一个Activity覆盖时处于停止状态,仍保留所有的状态和成员信息, 该Activity不可见。
(2)Activity的生命周期
(3)Activity的主要生命周期方法
- onCreate():创建activity时调用。以Bundle的形式提供对以前储存状态的访问。
- onStart():activity变为在屏幕上对用户可见时调用。
- onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个activity,该方法总是被调用的)。
- onPause():activity被暂停或收回资源时调用,该方法用于保存activity状态,也是保护现场,相当于压栈。
- onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
- onRestart():重新启动activity时调用。该activity仍在栈中,不启动新的activity。
- onDestroy():activity被完全从系统内存中移除时调用,该方法被调用可能是因为程序直接调用onFinish()方法或者系统决定停止该activity以释放资源。
(二)Android开发环境的建立
1.Android开发环境的构成
Android开发工具:JDK + IDE + Android SDK + ADT
2.Android 软件开发工具包
完整可运行的 Android 软件开发工具包由三个组件组成
- Android SDK tools
- Android SDK Platform-Tools
- SDK Platform Android API
Android SDK tools为开发提供调试和测试工具并提供对整个软件工具包的更新功能。
Android SDK Platform-Tools提供平台(也就是不同版本的Android系统)所需要的软件。
SDK Platform Android API是Android SDK的核心,提供开发所需要的库和代码,分版本(比如2.2、4.4、7.0等)。
Android ADT:为IDE设计的Android应用程序插件。ADT扩展了IDE功能,可以快速建立新的Android项目。
ADT添加了基于Android框架API的组件,可使用Android SDK调试应用程序,ADT提高了Android应用程序的开发效率。
Android NDK:允许Android应用开发者嵌入从C、C++源代码文件编译出的本地机器代码到各自的应用软件包中。
3.JDK的安装及Java环境配置
- 首先下载并安装JDK
- 下载并安装 (My)Eclipse IDE for Java Developers(或AS)
- 从官网上下载最新版本的Android SDK,分为Windows,Mac OS,Linux3种版本
- 设置或配置Android SDK环境变量ANDROID_PATH
- 可以通过SDK Manager管理android sdk的更新和升级
(三)Android的基本组件
1.Android应用程序的构成
2.Android的可视化组件
3.View组件
View组件是构成 Android UI 的必选组件,是Activity组件的重要组成成分。
Android 的任何可视化组件都需从android.view.View类继承。
- 可使用XML配置生成View,然后装载View
- 也可通过代码创建View
Android的视图分为三种,都是android.view.View类的子类。
- 布局(Layout)
- 视图容器(View Container)类
- 视图类
Android.view.ViewGroup 是一个容器类,也是View 类的子类,所有的布局类和视图容器类都是ViewGroup的子类。
(1)View组件的类图
(2)使用XML布局文件定义视图
- XML布局文件是Android 系统中定义视图的常用方法,若当前主布局文件为 <main.xml>,需要在 Activity 的 onCreate()方法中指定XML布局文件的资源ID。
setContentView( R.layout.main )
- 如果想获得在 main.xml 文件中定义的某个View :
EditText edittext1 =(EditText)findViewById(R.id.sample_edit_text0);
Button button1 = (Button) findViewById(R.id.sample_button0);
- 为了避免造成歧义或布局错误,同一个布局文件中应该使视图ID值唯一。
(3)在代码中控制视图
4.Activity组件
(1)创建Activity
任何Activity应用类都必须从Activity类或者其子类中继承。
覆盖Activity类的onCreate()方法。默认状态下Activity类中没有任何控件,屏幕顶端有一个默认的标题栏,要想在Activity中添加控件,最直接的办法就是在onCreate()方法中装载XML布局文件或使用代码添加控件。
注意:
- 不能在Activity构造方法中初始化控件 或 装载View。
- 不要在Activity中添加带参数的构造方法,如果必须要添加,则必须包含一个无参数构造方法。
(2)配置Activity
(3)显示其它的Activity
Android应用通常包含多个Activity,会涉及MainActivity中调用其它Activity的问题,Android不允许创建Activity对象实例并进行显示,只能使用 android.content.Intent 作为中间代理,并使用 startActivity 或 startActivityForResult 方法创建并显示Activity
(4)在不同Activity之间传递数据
窗体切换过程中通常会发生数据传递,Android中传递数据的方法有很多,常见的方法:
- 通过 Intent 传递数据(最常用的数据传递方法)
- 通过静态(static)变量传递数据
- 通过剪贴板(clipboard)传递数据
- 通过全局变量传递数据
①通过 Intent 传递数据
通过Intent的putExtra方法将简单类型的数据或可序列化的数据保存在Intent对象中,在目标Activity中使用getXxx方法( getint()或者getString() )方法获得这些数据。
②使用静态变量传递数据:使用Intent传递数据也存在局限性,无法传递不能序列化的对象,也就是没有实现java.io.Serializable接口的类对象,静态变量法是一种方便且易用的传递数据方法。
③使用剪贴板传递数据:几乎所有的系统均支持剪切板技术,可将某些数据事先复制到剪切板上,其它任何程序均可从剪切板中获得这些数据。
④使用全局对象传递数据:由于大量的静态变量可能引发内存溢出,代码可维护性较差,可用全局变量代替静态变量来完成数据传递。
5.Fragment组件
(1)动态使用
要管理Fragment,需使用FragmentManager,用FragmentManager完成如下功能
①使用方法findFragmentById()或findFragmentByTag(),获取activity中已存在的fragment。
②使用FragmentManager打开FragmentTransaction来执行fragment的事务,添加或删除fragment。
(2)静态使用
这是使用Fragment最简单的一种方式,把Fragment当成普通的控件,直接写在Activity的布局文件中
①继承Fragment,重写onCreateView 确定 Fragemnt 布局。
②在Activity中声明此Fragment,和普通的View一样。
6.Intent组件
定义执行某种工作的“意图”,用Intent可执行的任务包括:
- 广播消息
- 启动Service
- 启动Activity
- 显示网页或联系人
- 拨出或接听电话等
Intent并不总是由应用程序发起,系统也会使用Intent向应用程序通知特定的事件(比如短消息到达通知或来电通知等)。
Intent可以是显式或隐式的,Intent将操作和操作处理程序松散的耦合在一起。
(1)Intent组件的作用
三大核心组件(Activity、Service和BroadcastReceiver)之间通过Intent消息机制实现交互。Intent是对一个将要执行动作的抽象描述,一般作为参数使用
- 调用startActivity()启动一个activity
- 由broadcastIntent()传递给所有感兴趣的BroadcastReceiver
- 由startService()或bindservice()启动一个后台service
(2)Intent的组成
Intent属性:Action, Data, Category, Type, Component和Extras
- Action:表示要实施的动作,如ACTION_VIEW, ACTION_EDIT等。参照Android.content.intent类,constants中定义了所有action。
- Category:指定action的执行环境。
- LAUNCHER_CATEGORY 表示Intent 接受者应该在Launcher中作为顶级应用出现。
- ALTERNATIVE_CATEGORY表示当前Intent是一系列可选动作中的一个,这些动作可以在同一块数据上执行。
- Data:要实施的具体数据,一般由Uri变量表示,通过设置data,可以执行打电话,发短信,开发网页等操作。
- Type:显式指定Intent的数据类型。一般Intent的数据类型能够根据数据本身进行判定,通过设置该属性,可以强制采用显式指定的类型而不再进行额外的判定。
- 设置data时,系统会默认将type设置为null,设置type时,系统会默认将data设置为null。一般情况下,data和type只需要设置一个,如果既想设置data又想设置type,那么可以使用setDataAndType()。
- Component:指定Intent目标组件的类名称。通常Android会根据Intent 中包含的其它属性信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果指定component属性,将直接使用它指定的组件,而不再执行上述查找过程。指定了该属性后,Intent的其它所有属性都是可选的。
- Extras:是所有附加信息的集合。使用extras可为组件提供扩展信息,比如,如果要执行“发送电子邮件”,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
(3)Intent解析
Intent分为显式和隐式
-
- 显式Intent用于应用内部组件之间消息传递
- 隐式Intent则用于多个应用程序之间的交互
- Intent Filter匹配的三要素是Action、Data以及Category
- 隐式Intent请求要能够传递给目标组件,必须要通过三个要素检查,任何一项不匹配,不会将隐式Intent传递给目标组件
组件中通常可声明多个Intent Filter。每个IntentFilter描述组件能响应Intent请求的能力。比如在需要请求网页浏览器时,网页浏览器程序的Intent Filter就应该声明它所希望接收的Intent Action是WEB_SEARCH_ACTION,以及与之相关的请求数据是网页地址URI格式
(4)Action匹配
<intent-filter>元素中可以包括子元素<action>,比如:
<intent-filter>
<action android:name=”com.example.project.SHOW_CURRENT” />
<action android:name=”com.example.project.SHOW_RECENT” />
<action android:name=”com.example.project.SHOW_PENDING” />
</intent-filter>
每个<intent-filter>至少包含一个<action>,若Intent请求的Action和<intent-filter>中某一条匹配,则匹配成功。若Intent请求或<intent-filter>中没有说明具体的Action类型:
(1) 如果< intent-filter>中没有包含Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配。
(2) 如果Intent请求中没有设定Action类型,只要<intent-filter>中包含 Action类型,这个Intent请求就将顺利地通过<intent-filter>的匹配。
(5)Category匹配
<intent-filter>元素可包含<category>子元素,比如:
< intent-filter . . . >
< category android:name=”android.Intent.Category.DEFAULT” />
< category android:name=”android.Intent.Category.BROWSABLE” />
< /intent-filter>
当Intent请求中的Category与组件中某一个Intent Filter的<category>完全匹配时,该Intent请求将成功匹配。
Intent Filter中多余的<category>声明并不会导致匹配失败。一个没有指定任何类别匹配的 Intent Filter只会匹配没有设置类别的Intent请求。
(6)Data匹配
数据在<intent-filter>中的描述如下:
< intent-filter . . . >
<data android:type=”video/mpeg” android:scheme=”http” . . . />
<data android:type=”audio/mpeg” android:scheme=”http” . . . />
</intent-filter>
指定希望接受的Intent请求的URI和数据类型
URI分为三个部分:scheme、authority和path。进行匹配时,用 setData()设定的URI数据类型和scheme必须与Intent Filter中所指定的一致。若Intent Filter中还指定了authority或path,也需要进行匹配。
7.Service组件
主要用于没有用户界面,但需要长时间在后台运行的应用,Service分为本地Service和远程Service,本地Service是只能由承载该Service的应用程序访问的组件,而远程Service则可由设备上运行的其它应用程序远程访问,比如邮件轮询应用等。
(1)采用startService启动服务
(2)采用bindService启动服务
(3)Broadcast Receiver组件-概述
- BroadcastReceiver用于异步接收广播Intent,包括Normal broadcasts和Ordered broadcasts两类,前者属于完全异步工作模式,后者则是有序模式,每个receiver执行后可以传播到下一个receiver,也可以中止传播
- BroadcastReceiver通常不能提供可视化的界面来显示广播信息。可以使用Notification和Notification Manager来实现可视化信息界面,显示广播信息的内容,图标等。
- 一个BroadcastReceiver对象只有在被调用onReceive(Context, Intent)时才有效的,从onReceive函数返回后,该对象就变为无效且结束生命周期。
(4)Broadcast Receiver组件-发送和接收广播
- 事件广播比较简单,首先构建Intent对象,然后调用sendBroadcast(Intent)方法将广播发出:
Intent intent = new Intent(String action);
sendBroadcast(Intent);
- 接收广播通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中响应事件
public class SReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//get data from intent
Bundle bundle = intent.getExtras();
if (bundle != null){}
(5)Broadcast Receiver组件-注册Receiver
8.Content Provider组件
- ContentProvider是Android系统提供的一种标准的共享数据机制,应用程序可以通过ContentProvider访问其它应用程序的私有数据,私有数据可以是存储在文件中的数据,也可以是SQLite中的数据。
- Android系统内部提供一些内置的ContentProvider,能够为应用程序提供重要的数据信息。
- 虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
(1)共享数据
- 第一步:继承ContentProvider并重写下面方法:
public class PersonContentProvider extends ContentProvider{
public boolean onCreate()
public Uri insert(Uri uri, ContentValues values)
public int delete(Uri uri, String selection, String[] selectionArgs)
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
public String getType(Uri uri)
}
- 第二步:在AndroidManifest.xml使用<provider>配置ContentProvider,为了能让其他应用找到该ContentProvider,ContentProvider采用authorities(主机名/域名)进行唯一标识,可把 ContentProvider看作一个网站,authorities 就是他的域名:
<manifest .... >
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<provider android:name=".PersonContentProvider"
android:authorities="cn.itcast.provider.personprovider"/>
</application>
</manifest>
(四)Android程序的基本结构
1.Android应用程序的结构
- src:存放java源代码文件,所有允许修改的java文件和用户自己添加的java文件都保存在这个目录中。
- gen(generated)包含ADT自动生成的java代码文件,例如R.java,该目录下的文件是系统自动维护的。
- R.java文件是ADT自动生成的文件,包含对drawable、layout和string目录内的资源的引用指针,Android程序能够直接通过R类引用目录中的文件,若添加和修改了引用的资源文件,须更新R.java文件中的代码。
- Android.jar文件是Android程序所能引用的函数库文件,Android通过平台所支持的API都包含在这个文件中。
- res目录是资源目录,保存应用程序用到的所有资源文件,含三个主要子目录,该目录下文件发生变化时,编译后自动生成的R.java就会发生变化
- drawable目录用来保存图像文件
- layout目录保存与用户界面相关的布局文件
- values目录保存字符串、颜色、风格和主题等常量数据
- 在HelloAndroid工程中,ADT在drawable目录中自动引入了程序的图标文件(png文件),在layout目录生成了mail.xml文件,用于描述用户界面,在values目录中生成了strings.xml用来定义应用中的字符串常量。
- AndroidManifest.xml是XML格式的Android程序声明文件,包含了Android系统运行Android应用程序前所必须掌握的重要信息,这些信息包含应用程序名称、图标、包名称、模块组成、授权和SDK最低版本等,每个android程序都必须包含该文件。
- AndroidManifest.xml文件类似于Java EE中的web.xml文件,定义了应用程序的内容和行为。例如,该文件可列出应用程序的Activity和Service,以及运行应用程序所需要的权限和功能。
2.Android的资源
- 在Android 程序结构中,资源扮演着重要的角色。Android中的资源通常绑定到文件(比如音乐文件)或值(比如对话框的标题),这些文件和值绑定到可执行程序的方式很友好,无需重新编译和重新部署应用程序就能够更改。
- Android主要通过两种文件类型来支持资源:XML文件和原始文件(包括图像、音频和视频),有时XML文件整体就是一个资源(比如字符串资源文件和布局资源文件)。
3.XML文件作为Android资源
XML文件作为Android资源分为三种情况
- XML文件作为资源需编译为二进制文件,然后打包到应用程序,这些XML文件具有预定义的格式,其中XML节点被转换为ID。
- 某种自由格式的XML文件作为资源,需编译为二进制格式,但该XML文件不会被解释,也不会生成资源ID,可通过XML阅读器来读取该类XML文件。
- 将XML放到raw目录下,此时不需要将该文件编译为二进制格式,必须使用明确的基于流式传输的API来读取文件,比如音视频文件。
如果XML文件位于res/values子目录以外的任何地方,ID会基于文件名产生,否则,会根据文件的内容来生成ID。
4.Android的关键资源
- 颜色:表示指向颜色编码的颜色标识符,公开表示为R.color.*
- 字符串:表示字符串资源,公开表示为R.string.*
- 字符串数组:表示字符串数组资源,公开表示为R.array.*
- 尺寸:表示各种元素或视图的尺寸和大小,公开表示为R.dimen.*
- 图像:表示图像资源,支持的图像格式包括jpg、png、gif。表示为R.drawable.*
- 色图:表示用作视图背景的矩形色块或普通图形对象,比如位图。公开表示为R.drawable.*
- 任意XML文件:公开表示为R.xml.*
- 任意原始资源,表示为R.raw.*
5.资源引用
6.AndroidManifest.xml文件结构
(1)AndroidManifest.xml的功能
AndroidManifest.xml文件是Android应用程序中最重要的文件之一,是android应用程序的全局配置文件。该文件位于应用程序的根目录下,描述了package中的全局数据
- 指定应用程序的Java包,包名作为应用程序的独特标识
- 描述应用程序组件,包括Activity,Service,Broadcast Receiver和Content Provider等。指定了实现每个组件的类并公开发布它们的能力(例如,它们持有哪个Intent信息)
- 决定那些进程将容纳应用程序组件
- 声明本应用程序必须拥有哪些许可,以便访问API的被保护部分,以及与其他应用程序交互
- 声明其他应用程序在和该应用程序交互时需要持有的许可
- 声明该应用程序所需的Android API的最小版本
- 列出该应用程序必须链接的库
(2)AndroidManifest.xml的主要结构及规则
第三部分、IOS操作系统
一、IOS系统介绍
IOS 是一个基于UNIX内核的操作系统
IOS有一个基于 微内核(将系统内核的部分任务交给用户层进程处理) Mach 的Darwin内核,该内核也属于BSD家族。
微内核提供一组“最基本”的服务,如进程调度、进程间通信、存储管理、处理I/O设备。其他服务,如文件管理、网络支持等通过接口连到微内核。
微内核的所有服务均在用户模式下运行,而处理这些服务与处理其他任何程序一样。因为每个服务只是在自己的地址空间运行,服务之间彼此之间都受到了保护。
1.大内核与微内核
2.IOS系统
- IOS有一个叫做 Cocoa Touch 的运行时框架, Cocoa Touch框架重用了许多 Mac 系统的成熟模式,但更多专注于触摸的接口和优化, Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计。
- IOS使用Objective-C(一个C语言的超集)作为开发语言,Objective-C 的95%是C, Objective-C 运行时核心是消息分发。
- 大部分Cocoa Touch功能是用Objective-C实现的。Objective-C 是一种面向对象的语言,编译运行速度很快,采用了真正的动态运行时系统,从而增添了灵活性。
- Java只有自动内存回收,Objective-C支持自动与手动内存回收,IOS只有手动内存回收,可手动管理内存,在用户操作间歇由程序员进行回收,因此用户不会在频繁使用过程中感受到停顿。
3.Objective-C与Runtime交互
- Objective-C是一门动态语言,把部分工作从编译连接时推迟到运行时,因此只有编译器是不够的,还需要一个运行时系统 执行编译后代码,这是 Objective-C Runtime 系统存在的意义。
- Objective-C从三个不同层级上与Runtime系统进行交互
(1) 通过 Objective-C 源代码:动态语言部分工作直接交给Runtime执行,类、方法和协议在Runtime均有对应数据结构。
(2) 通过 Foundation 框架的NSObject类定义的方法。在运行时获得类的信息,并检查一些特性。
(3) 通过对 Runtime 函数直接调用 。 Runtime 系统是一个由一系列函数和数据结构组成,具有公共接口的动态共享库。
4.IOS基于硬件加速
- IOS系统对图形的各种特效处理是基于 GPU 硬件进行加速的,它可以不用完全借助 CPU 或者程序本身,而是通过 GPU 进行渲染以达到更流畅的操控表现。
- Android 并非如此,因为Android系统需要适应不同的手机硬件,需要满足各种差异配置,所以很多图形特效都要靠程序本身进行加速和渲染,强依赖于CPU的运算,图形操作会加大处理器负荷,从而出现卡顿问题。虽然Android 高版本系统中已经将硬件加速设为默认开启,但依旧无法做到所有特效均靠 GPU 进行加速。
二、IOS系统架构及iPhone应用程序框架
1.iPhone系统架构
2.Framework介绍
- Framework 类似于Windows 库,但比Windows库更加强大,通过 Framework可共享所有形式的资源,包括:
- 动态共享库
- nib文件(Interface builder文档)
- 图像字符资源
- 文档
- IOS系统会在需要时将Framework载入内存,多个应用程序可同时使用同一个Framework,内存中只需要存在一份拷贝。
- Framework同时也是一个bundle(类似于一个目录),既可以在 finder 里浏览其内容,也可以在代码中通过 NSBundle 访问。
- 利用Framework 可实现动态或静态库功能,与动态/静态库相比,Framework 有如下优势:
(1)能将不同类型资源统一打包,易安装、易卸载与定位。
(2)能进行版本管理,使Framework能不断更新并向后兼容。
(3)同一时间,即使有多个应用程序使用同一Framework,但内存中只有一份Framework只读资源拷贝,减少了内存占用。
3.iPhone系统(IOS)架构介绍
- IOS 扮演底层硬件和应用程序中介。应用程序不能直接访问硬件,需要和系统接口交互,由系统接口和驱动打交道。这样的抽象可以防止应用程序改变底层硬件。
- IOS 实现可以看作是多个层的集合,底层为所有应用程序提供基础服务,高层则包含一些复杂的服务和技术。
- 在编写代码时,应尽可能使用高层框架,而不使用底层框架。高层框架为底层构造提供面向对象的抽象,可减少代码行数,同时还对诸如socket和线程等复杂功能进行封装,从而让编写代码变得更加容易。
- 虽说高层框架是对底层构造进行抽象,但是它并没有把底层技术屏蔽起来。如果高层框架没有为底层框架的某些功能提供接口,开发者可以直接使用底层框架。
4.IOS开发架构
5.Cocoa Touch层
- Cocoa Touch 是IOS架构中最重要层之一。该层包含开发IOS应用程序的关键框架。当开发IOS应用时,开发者将从这些框架开始,然后向下追溯到需要的较低层框架。
- Cocoa Touch层主要包括 UIKit 和Foundation Framework。
- Cocoa Touch层提供了基本系统行为支持,若要实现更为复杂的行为和界面,可考虑向下层探寻技术支持。
(1)Cocoa Touch层包含的框架
- UIKit 框架 (UIKit.framework):实现图形和事件驱动程序
- Foundation框架(Foundation.framework):包括文件、网络处理等
- Map Kit 框架 (MapKit.framework):提供可嵌入到应用程序的地图界面
- Message UI 框架 (MessageUI.framework):用于撰写电子邮件
- Address Book UI 框架 (AddressBookUI.framework):创建或编辑联系人信息的标准系统界面
- Event Kit UI 框架(EventKitUI.framework):提供视图控制键查看并编辑事件
- Game Kit 框架(GameKit.framework):支持点对点连接及游戏内语音功能
- iAd 框架 (iAd.framework):通过该框架在应用程序中发布横幅广告。广告会被放入到标准视图
(2)UIKit框架的类
- UIView类定义了视图的基本行为,但并不定义其视觉表示。UIKit通过其子类为文本框、按键及工具条等标准界面元素定义了具体的外观和行为。
- 包含Objective-C程序接口,提供图形、事件驱动的等功能。IOS每个应用均采用该框架实现应用管理、图形与窗口、触摸事件处理、用户接口管理等。
具体功能包括:
-
- 应用程序管理、用户界面管理、图形和窗口支持、多任务支持
- 视图、触摸及移动事件、动画
- 推送通知、本地通知的调度与发送、创建PDF
- 内置相机、电池、传感器等
(3)Fundation框架
Foundation Framework:UI 框架的基础, NSObject 就处在该框架之中,主要功能包括
- 定义值对象、集合、文件系统、URL、进程通信等对象
- 定义常用结构体,比如NSRange、NSPoint、NSSize等
- 定义日期操作
- 定义字符串、数组、字典等对象
- 定义装箱、拆箱、反射等操作
6.Media层
- Media层包括图像、音频和视频技术,可在手机上创建多媒体体验和视听效果
- 利用Media层框架可快速地创建图像和动画
- Media层包括
- 图形图像技术(Quartz 图形绘制引擎、Core Animation动画 和 OpenGL ES)
- 音频技术(Core Audio和OpenAL)
- 视频技术(Core Video)
7.图像技术(Graphics Technologies)
高质量图像是所有iPhone应用的重要组成部分。任何时候,开发者可以采用UIKit框架中已有的视图和功能以及预定义的图像来开发iPhone应用。然而,当UIKit框架中的视图和功能不能满足需求时,开发者可用下列技术和方法来制作视图。
①Quartz
②Core Animation
③OpenGL ES
8.音频技术(Audio Technologies)
- IOS 音频技术为用户提供了丰富的音频体验。包括音频回放、高质量录音和触发设备振动功能等。
- IOS的音频技术支持的音频格式包括:AAC(高级音频编码格式)、ALAC(苹果无损音频压缩编码格式)、A-law(一种脉冲压缩格式)、IMA/ADPCM(IMA4)、Linear PCM、μ-law和Core Audio等。
① Core Audio :提供音频本地支持,可生成、录制、混合和播放音频,也能通过核心音频访问手机设备振动功能。
② OpenAL:是一个跨平台的标准,采用OpenAL的代码模块可以平滑地移植到其他平台。
9.视频技术(Video Technologies)
- IOS通过媒体播放框架支持全屏视频回放,支持的视频文件格式包MOV、MP4、M4V和3GP等
- 应用如下压缩标准:
① H.264 Baseline Profile Level 3.0 video,在30f/s 的情况下分辨率达到640×480像素。
② MPEG4规范的视频部分。
③ 众多的音频格式,包含在音频技术的列表里,如AAC、Apple
Lossless (ALAC)、A-law、IMA/ADPCM(IMA4)、线性PCM、μ-law和Core Audio等。
10.Core Service层
(1)Core Service层框架-电话本框架
电话本框架:提供手机设备中电话本编程接口。开发者能使用该框架访问和修改存储在用户联系人数据库里的记录。
IOS应用程序可以使用该框架获得联系人列表。
(2)Core Service层框架-核心基础框架
核心基础框架是基于C语言的接口集,提供iPhone应用的基本数据管理和服务功能:
-
- Collection数据类型(Arrays、 Sets等)
- Bundles
- 字符串管理
- 日期和时间管理
- 原始数据块管理
- 首选项管理
- URL和Stream操作
- 线程和运行循环(Run Loops)
- 端口和Socket通信
核心基础框架(Core Fundation)与基础框架( Fundation) 紧密相关,为相同的基本功能提供了Objective-C接口。
如果开发者混合使用Foundation Objects 和Core Foundation类型,可充分利用两个框架中的“toll-free bridging”。toll-free bridging意味着开发者能灵活使用这两个框架中的类型。
每个框架中的类和数据类型的描述注明该对象是否支持toll-free bridged。如果是,说明它与哪个对象桥接。
(3)Core Service层框架-CFNetwork框架
- CFNetwork框架:是一组C语言接口集,提供网络协议面向对象的抽象。开发者可以使用 CFNetwork框架操作协议栈,并且可以访问低层的结构(如BSD Sockets:不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制)。同时,开发者也能简化与FTP和HTTP服务器的通信,或解析DNS
- 使用CFNetwork框架可实现如下任务:
- BSD Sockets
- 利用SSL或TLS创建加密连接
- 解析DNS Hosts
- 解析HTTP协议,鉴别HTTP和HTTPS服务器
- 在FTP服务器工作
- 发布、解析和浏览Bonjour(零配置联网)服务
(4)Core Service层框架-核心位置框架
- 核心位置框架(Core Location Framework)主要获得手机设备当前的经纬度。
- 核心位置框架利用附近的GPS、蜂窝基站或Wi-Fi信号信息测量用户的当前位置。
- iPhone地图应用使用这个功能在地图上显示用户当前位置。开发者能融合该技术到特定应用中,给用户提供位置信息服务。
(5)Core Service层框架-安全框架
- IOS除内置安全特性外,还提供外部安全框架,确保应用数据安全性。该框架提供了管理证书、公钥/私钥对和信任策略等的接口。支持产生加密安全的伪随机数,也支持保存在密钥链的证书和密钥。
- CommonCrypto接口也支持对称加密、HMAC(哈希消息认证码)和数据摘要。在IOS里没有OpenSSL库,但是数据摘要提供的功能在本质上与OpenSSL库提供的功能一致。
(6)Core Service层框架-数据库框架SQLite
- iPhone应用中可以嵌入一个小型SQL数据库SQLite,而不需要在远端运行另一个数据库服务器。开发者可以创建本地数据库文件,并管理这些文件中 的表格和记录。
(7)Core Service层框架-XML支持框架
- 基础框架提供NSXMLParser类,解析XML文档元素。
- libXML2库提供操作XML内容的功能,可以快速解析和编辑 XML数据,并可将XML内容转换为HTML。
11.Core OS层
- Core OS层包含操作系统的内核环境、驱动和基本接口。内核基于Mac操作系统,负责操作系统的各个方面。它管理虚拟内存系统、线程、文件系统、网络和内部通信。
- Core OS层的驱动也提供了硬件和系统框架之间的接口。基于安全方面的考虑,只有有限的系统框架类能访问内核和驱动。
- IOS提供了许多访问操作系统低层功能的接口集,iPhone 应用通过LibSystem库访问这些功能,这些接口集如下所示:
- 线程(POSIX线程)
- 网络(BSD sockets)
- 文件系统访问
- 标准I/O
- Bonjour(零配置联网)和DNS服务
- 区域语言相关信息(Locale Information)
- 内存分配
- 数学计算
三、IOS应用程序的基本结构
1.IOS APP生命周期流程图
- applicationDidFinishLaunching:是应用程序对象实例化后,程序首先被触发的方法。
- applicationWillResignActive:当应用程序将要进入非活动状态执行,此期间应用程序不接收消息或事件,比如来电话、锁屏等。
- applicationDidBecomeActive: 当应用程序进入活动状态执行。
- applicationDidEnterBackground:当程序被推送到后台时调用,要设置后台继续运行,在这个函数里设置即可。
- applicationWillEnterForeground:当程序从后台将要重新回到前台时调用。
- applicationWillTerminate:当程序将要退出时被调用,通常用来保存数据并做一些退出前的清理工作。
2.IOS程序的状态
- IOS中程序分五个状态:活跃,不活跃(锁屏,程序不接受事件),运行结束,后台运行,挂起(或冻结)
- 后台运行:是指不在界面中显示,但是代码还在执行
- 挂起:程序在内存中,但是代码不执行
- IOS中除部分系统级应用(如音乐、邮件、Safari等)可实现“真后台”外,大部分第三方应用在运行后按Home键回到首页,虽然能够在双击Home键呼出的多任务列表中看到该应用,但此应用实际已处于冻结状态。
3.视图控制器
- 视图控制器是控制应用程序如何运行的核心。
- 通常在视图控制器中实现应用程序如何响应选择。
- 若之前没有使用Interface Builder创建预定义视图,可以在视图控制器中加载和布局视图。
- main.m 和应用程序委托(AppDelegate.m)通常较小,但视图控制器(ViewController)源代码通常较大,定义了应用程序访问资源和对用户做出响应的所有方式。
4.UIViewController 的生命周期方法
- viewDidLoad:APP载入时会先通过调用loadView方法或者载入IB中创建的初始界面的方法,将视图载入到内存中。然后调用该方法进行进一步的设置。通常,对于各种初始数据载入,初始设定等内容,都会在这个方法中实现。
- viewDidUnload:系统退出或收到内存警告时调用该方法,将不需要在内存中保留的对象释 放,将其指针置为nil。
- viewWillAppear:对即将显示的视图做进一步的设置,在调入视图时,可对数据做更新。
- viewDidAppear:对正在显示的视图进行进一步的设置。
- viewWillDisappear:视图变换时,当前视图即将被移除、或者被覆盖时,调用该方法进行一些善后的处理和设置。
- viewDidDisappear:可重写这个方法,对已经消失,或者被覆盖,或者已经隐藏了的视图做一些其他操作。
5.视图控制器的关键方法
- laodView和viewDidLoad方法:假设不是用XIB文件对视图布局,loadView方法必须设置屏幕,并对所有子视图布局。继承一个具体类(如UITableViewcontroller)时,务必调用[super loadView] 或实现viewLoad,使父类可对屏幕进行适当设置。
- shouldAutorotateToInterfaceOrientation方法:自动使屏幕与iPhone的方向匹配,还必须定义屏幕元素应该如何更新。
- viewWillAppear和viewDidAppear方法:当视图准备在屏幕上显示或者视图已在屏幕上完全显示时调用这两个方法。
- 第一个方法准备要显示的视图信息,调用时视图可能还未加载,如果依赖于访问连接到子视图的IBOutlets,要调用self.view以确保视图层次被加载。
- 第二个方法用来触发视图完全显示在屏幕上之后的行为,例如动画。
6.沙盒机制
- IOS沙盒是一个基于TrustBSD策略框架的内核扩展模块访问控制系统,针对每个进程均可制定沙盒配置文件对其行为进行控制。沙盒机制使得程序行为得到了控制,强制隔离了应用程序,并保护了应用程序数据和底层操作系统数据不被恶意修改。
- IOS应用程序可以在自己的沙盒中运行,但是不能访问除此之外的任何沙盒。
- IOS应用不能共享数据(除了通过用户控制的系统粘贴板)。
- 文件必须位于沙盒提供的文件夹中,并且不能将文件复制到其他应用程序的文件夹中,或从其他应用程序文件夹中复制文件。
- 任何读写沙盒之外的尝试都将被AppStore拒绝,IOS禁止应用程序将内容写到沙盒外的文件夹中。
- IOS应用程序拥有自己的Library、Document和tmp文件夹。
四、IOS UITouch 及触摸事件
1.IOS的触摸事件
- 触摸事件是IOS中发生最多的事件。
- 触摸事件是当用户手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对象。
- 系统将触摸事件按照特定路径传递给可对其进行处理的对象。
- 在IOS中,一个UITouch对象表示一个触摸,一个UIEvent对象表示一个事件。事件对象中包含与当前多点触摸序列相对应的所有触摸对象,还可以提供与特定视图或窗口相关联的触摸对象。
- 触摸信息包括时间和空间两方面的信息
- 时间方面的信息称为阶段(phase),表示触摸刚刚开始、正在移动、处于静止状态,手指从屏幕抬起
- 空间触摸信息包括当前触摸位置在视图或窗口中的位置信息,以及之前的位置信息。当一个手指接触屏幕时,触摸就和某个窗口或视图关联在一起,这个关联在事件的整个生命周期都会得到维护。
2.IOS的触摸响应者对象
- 响应者对象是可以响应事件并对其进行处理的对象。
- UIResponder是所有响应者对象的基类,它不仅为事件处理,而且也为常见的响应者行为定义了编程接口。
- UIApplication、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。
- 第一响应者是应用程序中当前负责接收触摸事件的响应者对象(通常是一个UIView对象)。UIWindow对象以消息形式将事件发送给第一响应者,使其有机会首先处理事件。如果第一响应者没有进行处理,系统就将事件(通过消息)传递给响应者链中的后继响应者。
3.IOS的触摸事件处理
- 为了处理给定事件,响应者对象常常从传入的集合参数中取得一或多个UITouch 对象,然后考察这些对象的属性或取得它们的位置(如果需要处理所有触摸对象,可以向该NSSet 对象发送anyObject 消息)。
- UITouch 类中的locationInView方法,如果传入self 参数值,会给出触摸动作在响应者坐标系统中的位置(假定该响应者是UIView对象,且传入的视图参数不为nil)。另一个与之平行的方法previousLocationInView ,可给出触摸动作之前的位置。
- UITouch实例的属性还可以给出发生多少次触碰(tapCount)、触摸对象创建或最后一次变化发生的时间(timestamp)、以及触摸所处的阶段(phase)。
4.IOS触摸事件的响应者链
响应者链是一个响应者对象连接序列,事件或动作消息依次传递。它允许响应者对象把事件处理的职责转交给其它更高层的对象。应用程序通过向上传递一个事件来查找合适的处理对象。应用程序在处理触摸事件时也可以利用响应者链。响应者链由一系列的下一个响应者组成。
- Step1:第一响应者传递事件或动作消息给它的视图控制器(如果有的话);如果没有视图控制器,就传递给其父视图。
- Step2:如果视图或者其视图控制器不能处理该事件或动作消息,将传递给该视图的父视图。
- Step3:在视图层次中的每个后续父视图均遵循Step2模式。
- Step4:最顶层视图如不能处理该事件或动作消息,就传递给UIWindow对象来处理。
- Step5:若UIWindow对象不能处理,传给UIApplication对象。
- Step6:若UIApplication也不能处理该事件或动作消息,将抛弃它。
第四部分:WinCE操作系统
1.系统简介
WinCE不仅仅只是一个操作系统,还包括对多种目标处理器以及外围设备的支持并提供了系统开发工具、应用开发工具、整合的应用程序(如IE),以及NET Frameworks,所有这些组件构成了WinCE系统的应用框架
在操作系统的基础上:
- 提供了方便的开发工具开发BSP,使得基本的WinCE操作系统Kernel可以迅速被移植到某个专用嵌入式系统的硬件平台上。
- 提供便捷的应用软件开发平台,以及应用程序在多种Windows平台间的快速移植能力。
- 操作系统以及所支持的特性可以根据嵌入式应用程序的需要,进行配置管理,使开发者可以根据需求来选择特性进行组合,构建出新系统。
2.基础组件
- 1、应用程序设计界面组件:包括MFC、ATL和.NET Framework架构。
- 2、网络通信组件:包括服务层、接口层、协议层和驱动层。服务层提供网络服务,接口层是系统的标准应用接口,协议层包括各种协议堆栈,驱动层是实体设备的支持基础。
- 3、数据存储组件:包括RAM存储、ROM存储以及用于支持ATA设备和SRAM卡等周边储存设备的存储,与个人计算机不同。
- 4、图形接口组件:整合win32 API、使用者接口和GDI,构建了GWES模块。
- 5、多语言和国际化支持组件:提供大量字符码支持。
- 6、安全组件:构建安全的网络通信、安全数据存储、标准加密体系和认证机制等。
- 7、应用整合组件:包括浏览器、Office组件、Media组件和远程桌面客户等。
3.系统模块与架构
4.系统模块
- 1、NK:WinCE系统的真正核心。
- 2、CoreDLL:分离了应用程序和操作系统,是应用程序系统功能的代理。
- 3、设备管理模块:提供设备列表管理、即插即用管理、电源管理、IO资源管理等功能。
- 4、数据储存模块:提供系统基本的数据储存能力。
- 5、图形接口模块:提供绘图引擎、窗口管理、接口事件机制等。
- 6、通信模块:提供网络通信支持。
- 7、OAL模块:包括硬件相关的若干功能,如总线控制器驱动、系统引导程序和初始化程序等。
- 8、驱动程序模块:是由驱动程序实体构成的集合。
- 9、Win32系统服务模块。
第五部分、典型的移动终端