此刻,夕阳沾染上了西方的雾气。最后的光线像守着古塔老人,被雾压碎镶嵌在时间河里,终于放出最后活力。夕阳与雾如此迷离,是不是一个指针?让我引用过去。
作为一个android开发者(学习者),相信你对于Activity,Service,intent,drawable,shape等等名词一定是很熟悉的。在日常的开发中,我们用这些特有的东西去构建我们的app。感谢开源的理念,网上,书上关于如何使用activity,service,view,intent的教程十分充足,介绍原理的文章书籍足够多,足够优秀。这边文章不涉及到这些细节。
这篇文章的主题是:如果我们一起跑到屋顶上往下看,那么写一个App到底写了些什么?
能力有限,疏漏之处,烦请指正。
一个特殊的Linux系统
相信大家都知道android系统的内核是Linux的内核,这意味着android具有了Linux的特性。由于不会讨论Android系统特有的实现,所以姑且就将Android系统当作一个Linux系统。
解决了上面那个问题,再看下面这个问题:
“Android系统是一个特殊的Linux系统”,这意味着什么呢?
多用户操作系统允许多个用户在同一时间内使用计算机。–维基百科
如上,不管在window还是在Linux都是存在同时有多个用户登录使用的。Window由于一般是个人电脑所以可能感受不深,而Linux作为服务器允许多个用户是必须的。
ok,继续看下一个问题:
多用户对android系统而言又意味着什么呢?
意味着可以同时有多个app运行,请求资源。
因为:
一个App就是一个用户。
一个App就是一个用户
一个App就是一个用户
重要的事情所三遍。
现在来说明一下,“一个App就是一个用户”这句话有什么内涵?
使用过Linux系统的人相信对于“User”这个概念一定不陌生。在Linux中,对于不同的文件往往具有不同的拥有者,也就是用户。当进入系统的时候,必须要有一个身份来做登录。这个身份就代表一个用户,一个“User”。
用户调用操作系统的资源,比如打开视频播放软件放电影就调用了系统关于视频播放的资源,上网就调用了上网的资源。这些资源的调用是通过这个“User”,进行的。
还记得上面,那句话吗?一个App就是一个用户。开发者写App就相当于在Android系统中“创造了一个User”。
通过这个“User”,也就是App,可以去调用系统的资源。举个例子,当我们使用“微信”给朋友发语音的时候,“微信”最终做了什么呢?
主要是两件事:1.调用系统的录音资源,录制一段音频数据 2.调用系统的网络资源,把数据发给服务器。
到这里,我们可以得出一个基本结论:App是系统资源的一个调用者。
讨论完了,“多用户”的意义。接下来再看看,权限管理机制。
By default, the system assigns each app a unique Linux user ID(the ID is used only by the system and is unknown to the app). The system sets permissions for all the files in an app so that only the user ID assigned to that app can access them.
如上,每个app都被分配了一个独一无二的ID,这个ID对app是透明的,系统知道,app自己不知道。一个app中的文件都被设置了权限,只有通过这个app的ID才能访问app的文件。
直观来讲,Android中每一个app一个自己不知道的ID,通过这样的机制,系统让其他app无法访问其文件。
这就是,权限管理机制的底层构想。
但是这样以来有个问题,如果app之间希望分享数据(比如想使用相机简单拍张图片)该怎么办呢?
答案是去向系统请求权限。这一点相信大家都不陌生,就不赘述了。
基于上面app之间分享数据的场景,还牵扯了app之间(实质上是进程之间)的问题,比如AIDL和ContentProvider。
开门见山,亮出观点:
一个app本质上就是android系统和用户之间的中间人。或者说app就是Android系统暴露的功能接口。
现在请暂时把开发android app划分为三部分(可能你并不认可):
叙述我的观点前,先来看看一个App是由哪几部分组成的?
我的观点是:
App = Application Component + User Interface + UseCase
Application Component指的是Android的四大组件,User Interface是用户界面,UseCase是具体一个App的业务逻辑。
首先来看四大组件。不知道大家有没有想过四大组件对于app来讲到底是个什么东西?
从Android系统角度来看,四大组件是其资源有组织形式的暴露。Activity是其暴露自己的屏幕资源,让App利用起来给用户图形体验的工具;Service是系统隐式暴露自己各种资源的工具;ContentProvider是协调系统协调App数据分享的工具;BroadCast Reciver是和App直接“交流”的工具,告诉App自己发生了什么。
简而言之,四大组件就是系统排到App的四个“外交官”,通过“外交官”,app可以很方便的和系统进行交流。
从App的角度来看,四大组件是一个App的骨架,一切app具体功能的实现都是在这个骨架上“生长”出东西。
User Interface,这个翻译是“用户界面”。不过我觉得这样表述出来,真的是把其韵味完全给抹杀掉了。为什么呢?首先,这个Interface就是接口(这里不是取Java那个interface关键字的意思,也是类中接口方法那个意思,简单来讲就是一个事物暴露出来的,用于外界跟自己交流的部分。)
User Interface是app提供给用户,让用户和自己交流(交互)的规范。
那么具体是什么呢?相信你也猜到了,最典型的就是各种View。比如用户在使用一个新闻App浏览新闻,存放信息的是一个RecyclerView,每一个Item是一个新闻标题,有很多条新闻,屏幕无法完全放下。
那么你会怎么做?
做什么做,只要使用RecyclerView,用户自己用手指滑不就是了。
对,用户用手指滑就是一种和app的交流,User Interface(如这里的RecylerView)就是规定了一种用户交流的规范(往上滑代表想看更多)。这样app就知道用户的行为是在表达什么需求。
这种app和用户的交流可能是双向的也可能是单向的。比如一个view的背景色就是单方面告诉用户这个view张什么样子,而button就是双向的,点击某个button开启一个功能,同时button要改变颜色来反馈用户我已经做了你要我做的事了。由此,就有了各种各样的View。但是其本质就是用户和app交流的规范。规范有好有差,差的就是不站在小白用户角度思考问题。
ps:电脑上普通用户如果浏览新闻就是滑鼠标,嗯,程序员的话,就是terminal
UseCase就是业务逻辑。现代建筑都是钢筋,水泥,玻璃等建筑材料组成的,但是现代建筑从功能到外观可以千差万别。App也是一样,其组成的材料都来自SDK,但是最后得到的产品却完全不一样。
这些不一样,来自组成“材料”的不同,对“材料”的运用方式不同,这些就是UseCase。这也是最终一个App的根本。
PS:main()就是取main的含义,这里把涉及到的东西串一下。
Android系统,Application Component,User Interface,用户之间的关系:
1.用户通过和app中的User Interface交互表达了自己的行为,app通过User Interface的交互规范可以从用户的行为中知道用户的需求.
2.接着,App通过compoents去调用系统的资源来完成用户的需求.
3.最后需求的结果会通过app的User Interface(各种View)在呈现给用户。
4.用户具体的需求内容与实现就是UseCase。
通过app component让app可以和系统进行交流,具体就是调用各种系统的资源,与用户打交道主要通过user interface来感受到用户的命令,这种interface从某个层面来讲就是规范了用户需求的表达。比如用户看新闻的时候向下拉就是刷新信息,这种动作让用户需求的表达得到了一个规范化的表达。UserInface通过各种Event事件来得到了这种表达,并将这种需求的表达转换为了可以用来编程的信息。app的component通过得到的这种信息从而有了调用系统资源的目标。于是app就可以这样来调用系统的资源了,通过各种资源获取到用户想要的信息,在把这种信息通过user interface表现出来,用户就收到信息。
总结下的话就是:用户<——>user interface<——>app component<——>android system,这么一个链条。user interface,app component,合起来就是开发者写的app。
android中还有些重要的部分,比如Intent,主要就是四大组件中除了ContentProvder之外的信使,manifest就是一个app中的compoents的户口登记表,而各种xml都是服务User Interface的后勤人员,URI就是ContentProvider…..嗯,时间关系,有机会下次在讨论了。
enjoy hacking!!