Android、iOS系统架构
1.1Android的系统结构
这个就是我们的Android的整体系统架构图,首先从整体上来看看Android的体系结构。
- Linux Kernel:Android就是一个操作系统,其底层基于Linux Kernel,这一层主要完成的是操作系统所具有的功能,比如这一层有许多的驱动程序,正是通过这些驱动程序来驱动设备上的硬件设备的。(kernel:内核)
- Android Runtime:Android的运行环境,Java程序运行需要Java核心包支持,然后通过JVM虚拟机来运行,Android Runtime里的Core Libraries就相当于Java的JDK,是运行Android应用程序所需要的核心库,Dalvik Virtual Machine相当于JVM,这是Google专门为Android开发的虚拟机。
- Liberaries:这里都是Android的库文件,例如我们访问的SQLite数据库的库文件等等。
- Application Framework:应用程序框架,这一层是我们重点学习的对象,通过各种各样的框架来实现Application。
- Application:这就是我们开发的Application了。
1.2 iOS体系结构
IOS的系统架构与Android的非常相似
- Core OS:核心系统层提供为上层结构提供最基础的服务如操作系统内核服务、本地认证、安全、加速等。
- 操作系统内核服务(BSD sockets、I/O访问、内存申请、文件系统、数学计算等)
- 本地认证(指纹识别验证等)
- 安全(提供管理证书、公钥、密钥等的接口)
- 加速 (执行数学、大数字以及DSP运算,这些接口iOS设备硬件相匹配)
- Core Services:核心服务层为程序提供基础的系统服务例如网络访问、浏览器引擎、定位、文件访问、数据库访问等,主要包含以下框架:
- CFNetwork(网络访问)
- Core Data(数据存储)
- Core Location(定位功能)
- Core Motion(重力加速度,陀螺仪)
- Foundation(基础功能如NSString)
- Webkit(浏览器引擎)
- JavaScript(JavaScript引擎)
- Media:媒体层主要提供图像引擎、音频引擎、视频引擎框架。
- 图像引擎(Core Graphics、Core Image、Core Animation、OpenGL ES)
- 音频引擎 (Core Audio、 AV Foundation、OpenAL)
- 视频引擎(AV Foundation、Core Media)
- Cocoa Touch:可触摸层主要提供用户交互相关的服务如界面控件、事件管理、通知中心、地图,包含以下框架:
- UIKit(界面相关)
- EventKit(日历事件提醒等)
- Notification Center(通知中心)
- MapKit(地图显示)
- Address Book(联系人)
- iAd(广告)
- Message UI(邮件与SMS显示)
- PushKit(iOS8新push机制)
2.1 Android的四种常用组件
我们现在推崇的软件开发就是基于组件来开发的,组件就类似于电脑的硬件一样,我如果要组装一台电脑,可以直接通过购买各个硬件然后将其组装在一起,对于软件来说,组件就类似于这个,我们开发一个软件,可以直接将这些组件组合在一起就行了。
Android一共有四种常用的组件:Activity、Service、ContentProvider、BroadcastReceiver
- Activity:Activity就是我们应用程序的界面,主要用来跟我们的用户进行交互的,比如一个文本框,按钮这些就是显示在activity上的,并且可以几首数据,传递数据到后台,然后显示出来。
- Service:Service我们是看不见的,对于绝大部分的数据处理,业务的处理都是通过Service来完成。
- ContentProvider:ContentProvider类似于我们的档案馆,里面存放了我们的各种数据,例如通讯录中的信息等,这个组件就是运行程序对其进行访问,然后得到里面的数据。(Provider供应商)
- BroadcasetReceiver:BroadcastReceiver组件就是广播接收器,主要用来监听系统的各个行为的,例如当电量不足的时候会给我们发送一条广播信息。(Receiver接收器)
2.2 IOS
而IOS则采用委托和协议模式来实现应用程序的一些特定行为。
在IOS中, 由Cocoa Touch提供的框架之一UIKit来提供和管理应用程序的行为,包括应用程序的启动直到退出,UIKit 框架管理着应用程序的许多核心行为。
UIKit 框架包括一个UIApplication 对象,UIApplication 对象是应用程序的心脏,它从系统接收事件,然后将事件分派到应用程序实现的自定代码进行处理。
具体的应用程序只需实例化UIApplication 对象对象即可,无需进行子类化,应用程序的特定行为采用委托和协议模式由一个应用程序委托对象来实现。
应用程序在调用UIApplication 对象的UIApplicationMain函数来启动应用时,通过实例化一个应用程序委托对象并作为参数传给UIApplicationMain函数。
应用程序委托作为 UIResponder 的子类,也实现了UIApplicationDelegate协议,用来处理 UIApplication 对象委派的应用程序相关事件(主要是各种应用程序状态改变事件),来实现应用程序的定制化。
协议模式是osx 操作系统框架采用的特有的设计模式之一。协议是可编程接口的声明,任何类都可以实施它的方法。与协议相关联的类实例,调用协议的方法,并获取由该类正式采用和实现该协议所返回的值。对象之间的此类通信,产生了一个特定目标,例如解析 XML 代码或拷贝对象。协议接口两边的对象可以通过继承,实施远距离彼此相关。协议因此和委托一样,可作为子类化的替换手段。Apple 提供的框架,声明了数十个协议。
3.1 Activity的启动流程
我们大致了解了Android的体系结构后,就可以开始进行我们
的代码操作了,首先来看Activity的一个启动流程:
当运行我们的Android应用程序时,Android操作系统首先会去找我们的AndroidManifest.xml这个文件,这个文件是我们应用程序的主配置文件,因为我们一个应用可能有多个Activity,那么首先展示那个Activity呢?这个主配置文件就定义了当前这个应用的默认所加载的Activity对象,找到Activity对象后,就会调用其onCreate()方法,这个方法主要就是用来加载我们的布局文件,通过setContentView()方法可以来加载我们指定的布局文件,最后根据布局文件中的各个控件显示在我们的屏幕上。这个就是我们的Activity的启动流程。
玩法 | Android | IOS |
---|---|---|
入口配置 | AndroidManifest.xml | info.plist |
iOS的入口在main.m文件:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
main函数的两个参数,iOS中没有用到,包括这两个参数是为了与标准ANSI C保持一致。
UIApplicationMain函数,前两个和main函数一样,重点是后两个,官方说明是这样的:
// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.
UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);后两个参数分别表示程序的主要类(principal class)和代理类(delegate class)。如果主要类(principal class)为nil,将从Info.plist中获取,如果Info.plist中不存在对应的key,则默认为UIApplication;如果代理类(delegate class)将在新建工程时创建。