Android和iOS的区别(从开发角度比较)
一、两者运行机制不同
1. iOS采用的是沙盒运行机制
(1)沙盒机制
出于安全考虑,iPhone对于安装在上面的应用程序有所限制,这个限制就是应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。总体来说沙盒就是一种独立、安全、封闭的空间。
(2)沙盒机制的特点
每个应用程序都有自己的存储空间。每个应用程序都不可以翻过自己的围墙去访问别的存储空间的内容(已经越狱的除外)。在访问别人沙盒内的数据时需要访问权限。沙盒(sandbox)的核心内容是:sandbox对应用程序执行各种操作的权限限制
(3)应用程序的沙盒目录
应用程序沙盒目录下有三个文件夹Documents、Library(下面有Caches和Preferences目录)、tmp。
Documents:保存应用运行时生成的需要持久化的数据iTunes会自动备份该目录。苹果建议将在应用程序中浏览到的文件数据保存在该目录下。
Library/Caches:一般存储的是缓存文件,例如图片视频等,此目录下的文件不会再应用程序退出时删除,在手机备份的时候,iTunes不会备份该目录。
Library/Preferences:保存应用程序的所有偏好设置iOS的Settings(设置),我们不应该直接在这里创建文件,而是需要通过NSUserDefault这个类来访问应用程序的偏好设置。iTunes会自动备份该文件目录下的内容。
tmp:临时文件目录,在程序重新运行的时候,和开机的时候,会清空tmp文件夹。
2.安卓采用的是虚拟机运行机制
(1)什么是Dalvik虚拟机
Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层。
(2)Dalvik虚拟机的功能
Dalvik作为面向Linux、为嵌入式操作系统设计的虚拟机,主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。Dalvik充分利用Linux进程管理的特定,对其进行了面向对象的设计,使得可以同时运行多个进程,而传统的Java程序通常只能运行一个进程,这也是为什么Android不采用JVM的原因。Dalvik为了达到优化的目的,底层的操作大多和系统内核相关,或者直接调用内核接口。另外,Dalvik早期并没有JIT编译器,直到Android2.2才加入了对JIT的技术支持。
(3)Dalvik虚拟机具有以下特点
· 使用dex格式的字节码,不兼容Java字节码格式
· 代码密度小,运行效率高,节省资源
· 常量池只使用32位的索引
· 有内存限制
· 默认栈大小是12KB(3个页,每页4KB)
· 堆默认启动大小为2MB,默认最大值为16MB
· 堆支持的最小启动大小为1MB,支持的最大值为1024MB
· 堆和栈参数可以通过-Xms和-Xmx修改
详细参考:https://www.cnblogs.com/lao-liang/p/5111399.html
二、两者后台制度不同
1.iOS采用“伪后台”的形式
(1)iOS系统的后台机制过程
当我们程序从前台退到后台(按home)键后,将执行程序的委托方法。
// 当应用程序掉到后台时,执行该方法
-(void)applicationDidEnterBackground:(UIApplication *)application{
}
当一个iOS应用被送到后台,它的主线程会被暂停。你用 NSThread 的detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了。应用程序只给了我们可怜的一点点时间(也就是秒级别的)来处理东西,然后,所有的线程都被挂起了。这个时候APP依然驻留在内存中,这种状态下,不调用苹果已开放的几种后台方法,程序便不会运行;如果在这个时候,使程序继续运行,则为后台状态;如果当前内存将要不够用时,系统会自动把之前挂起状态下的APP请出内存。所以我们看到,有些时候打开APP时,还是上次退出时的那个页面那些数据,有时则是重新从闪屏进入。
(2)iOS系统后台机制大概可以分为5种状态
· Not Running:APP没有启动,也没有后台运行;
· Active:用户正在使用APP,比如说我们聊微信看网页的时候,APP就处于Active状态;
· Inactive:这是一个过渡的状态,APP虽然打开了,但是用户没有跟APP有任何互动操作;
· Background:APP在后台运行,微信会在没有打开的时候接收消息;
· Suspended:APP虽然在后台运行,但是处于休眠状态,只占用一点内存。
2. 安卓中任何程序都能在后台运行,直到没有内存才会关闭
(1)android后台运行机制
android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机,每个app都有自己的进程,每个进程都有自己的内存空间,这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。以上这些设计确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃。
(2)安卓的进程从高到底分为5种
· 前台进程:正在与用户交互的进程,通俗来讲就是你当前使用app的进程;
· 可见进程:可以被用户看到,但是没有和用户交互,例如一个activity以对话框的形式覆盖在当前activity上面,当前activity可以被用户看到,但是不和用户交互;
· 服务进程:这个相信大家都熟悉,也就是我们常说的service,能够运行在后台,常见的有音乐类的app;
· 后台进程:注意,这个后台进程不要和服务进程搞混了,它的意思是说当前app在后台运行,例如我启动了app,然后点击home返回到桌面,那么这个app就会被切回到后台进程;
· 空进程:空进程指的是在这些进程内部,没有任何东西在运行。保留这种进程的的唯一目的是用作缓存,以缩短该应用下次在其中运行组件所需的启动时间。
三、两者最高权限指令不同
1.iOS中用于UI指令权限最高。
2.安卓中数据处理指令权限最高。
四、推送机制
1.iOS在软件关闭的情况下,依然可以接收推送信息
手机消息当然都是通过服务器推送到我们手机上的,对于iOS的用户来说,苹果有APNs服务器来负责消息的推送。当你第一次使用APP时,会询问是否接收通知,如果你选择了是,那么服务器就会记录你的ID,当有消息通知的时候,这些数据是先推送到苹果的服务器中,然后通过苹果的APN服务器推送到用户手机上的。 这样的设计让软件彻底关闭的时候还可以接收到消息通知,一方面释放内存,一方面也不会耽误接收消息。
2. Android在软件关闭的情况下,无法接收推送信息
在Android手机来说,谷歌也有类似的GCM服务器来推送消息,不过因为国内的手机都没有谷歌服务无法收到谷歌GCM服务器推送的消息。安卓的推送都是通服务来实现的,就算应用没有启动但是服务还在一样可以收到推送。所以只能是安卓自己启动Services来实现推送,当应用杀死后Services如果被杀死就无法收到推送。
五、开源性
Android系统特点。Android系统由于是开放源代码,所以支持它的手机很多,可以免费使用的软件也很多,可以不断升级。iOS系统特点。他的主要特点是使用方便,灵活,但是由于其封闭的系统,可扩展性比较差。android相对ios来说更加开放.轻松的覆盖移动设备的中低端市场,甚至不仅仅移动市场,还有TV,笔记本,机顶盒,路由器,卡拉OK点唱机,车载导航,智能手表等等。