平行宇宙——iOS & Android

开始学习iOS有一段时间,先顺序学习了OC,Stanford的公开课看的差不多了,也写了些demo。觉得iOS在应用层的框架上和Android有很多相似的地方,或者,Android和iOS有很多相似的地方。通过学习iOS,也补充了之前在Android开发上一些盲区,跳出Android的框架看Android开发,又有新的看法,特别是对Android中MVC的理解。

下文从完成的MVC和细分出的导航环节对比Android和iOS,希望对你也有些帮助。如果你也有自己的看法,欢迎交流。两个“平行宇宙”的地方,是一些共同点或启示。

MVC

公开课的第一讲就是MVC;同样的,几乎看过的所有的Android教程里,也都会出现这个词。有关MVC的看法可以参见另一篇博文《iOS学习笔记——MVC》,在学iOS的过程中,不自觉地会和Android相对比,发现了很多以前在做Android开发时忽略的细节。

以前也总说MVC,但是也不知道MVC到底在Android的什么地方,以前觉得体验最明显的,就是Adapter这个东西。没错,Adapter,因为对Adapter最常见的描述或定义就是将数据填充到一个列表视图中。其他的地方就不甚了解了。当谈到四大组件的Activity时,就是“每个Activity描述一个界面”,现在看来,这些定义都并不准确。

当然,我通过公开课了解的内容也只代表公开课讲师对iOS的看法,可能还有其他的理解方式。iOS中很强调MVC作为一个整体在完整APP中起到的作用,每一个具有独立逻辑存在的结构都以MVC的形式存在。每个界面都包含至少一个MVC。MVC可以进行嵌套和组合,构成复杂的MVC树。

平行宇宙:

1. Android和iOS一样,每个APP同样也都是一个大的MVC结构,抛开“四大组件”这些在Android设计时加入的概念,Activity、Intent构成Controller的角色,Service是业务逻辑,Content Provider是数据协议,BroadcastReceiver是通信机制,可以算作对业务逻辑的支撑,这些共同构成Model的角色。

2. 那么Android中的View部分呢?还是View,当我们熟悉了XxxLayout类和xml布局,很容易忽略View类的基础作用。不知道你有没有过“一个个View构成一个Activity”的错误理解,事实上View只能包含更多的子View,多个View构成大的View结构。在Window下面,iOS和Android都有一个View类作为视图的根,在组织上,都是树状结构。

3. 还有一个要注意的地方,Fragment。Android在3.0中加入了Fragment,为了让Android提高对不同屏幕的适应能力。一个屏幕中可以同时显示多个平级的Fragment,对Fragment的这个描述是不是和iOS里的MVC很像?在MVC模型中,Fragment和Activity的地位是一样的,都是Controller。但是在Android中,Fragment依托于Activity存在,它的出现更像是细分了Controller的职责。不影响从MVC角度对Android APP结构的理解。

导航

对比Android和iOS的导航,在每个领域各有一个词出现的频率很高。Android上是“Intent”,iOS中是“Segue”。这里顺便吐槽一下国内的技术翻译文章或书籍,对于这些关键的词,就不需要翻译了吧?绝大多数在IT行业的童鞋,面对英文资料最困难的地方是整句的理解和上下文的逻辑联系,这些Key Word,就像变量一样,没必要翻译的,反而限制了思维,增加理解难度。好了继续,Intent用作Android组件之间的通信,每通信必有Intent存在,Intent在通信前和通信后的作用分别是“源组件确定目标组件”和“目标组件获取数据”。Segue也是在通信中存在,不过更细分一些,可以看做Controller之间的桥梁,A导航到B,在导航之前通过Segue可以获得B的引用,通过B的Interface对这次导航做参数配置。

在ActionBar出现之前,Android的导航几乎没有规则可言。Intent带来的匿名Intent导航,可以方便地从一个APP跳转到另一个APP,但是由此带来的维护成本和设计复杂度也是很客观的,因为开发者不知道用户什么时候能再次回到自己的APP,或许再也不会回去了。相比而言iOS使用UINavigationController对导航结构进行约定,同时因为iOS的沙盒机制,即便有APP间的跳转,那也是“真正的APP间跳转”,体验上可能略微劣于Android,但是这可以归结为使用习惯问题。从开发的角度,iOS的规范更为友好。

平行宇宙:

1Android使用ActivityTask对Activity进行管理,iOS的UINavigationController也使用类似“栈”的push、pop思想进行管理。Android上的Task对开发者是透明的,只能通过参数设定进行趋向控制,而iOS中是可以手动push和pop的。同时因为沙盒导致逻辑简化,iOS的可控性要很多。

通过学习iOS,意识到以后在做Android开发时,不管是产品层面对导航路线的设计还是在开发层面的逻辑的管理,都要注意,避免出现混乱和不可控的现象出现。同时因为匿名导航的不可预知,也要注意对数据的保存,防止用户数据丢失。