Android系统简要分析

来源:互联网 发布:数据之魅 pdf 编辑:程序博客网 时间:2024/05/19 14:00
       android中的view是一个很基本但却十分重要的概念,本文将以view为入口简要分析下android系统。我们接触一门新的语言常常是从在界面上输出HelloWorld开始的。对于刚开始接触android的开发人员,我们会通过IDE(以android studio为例)向导新建一个android应用,默认情况下程序运行后就会在android设备上显示一个helloWorld的文本控件,现在让我们看看IDE为我们做了那些事情,首先我们创建了activity,并且重写了onCreate方法,最终的结果是我们在界面上看到了一个HelloWorld的文本,让我们简要分析下这个过程。
       onCreate中我们进入了activity的生命周期的第一个方法,android通过一层层的封装让我们脱离了操作系统中的进程概念,转而为我们建立了以四大组件为核心概念的android系统,让我们不用去关心OS中的底层概念,一方面减少了重新造轮子的浪费。另一方面,为我们传递了android系统Framework开发人员想要为我们传递的概念空间,那android想要为我们传递怎样的概念空间
       回答这个问题我们有必要先看看Android为我们提供的四大组件这一核心概念。我们重点看看和用户界面打交道的Activity以及Service。Activity是为我们创建了一个界面的承载容器,我们通过activity的生命周期,控制界面展现以及界面上的控件与用户的交互,比如点击button可以启动新的界面,点击一个EditText可以输入用户想要输入的内容,仔细想想这两个例子,button和EditText都是View的子类,然而却可以处理用户操作,这里的view已经脱离了"视图"这个词所代表的静态展示的概念,转而因为listener的回调而具备了交互的外延概念。Activity在attach方法中会创建PhoneWindow这个主窗口,并最终将DecorView添加到WindowManager中管理,之后通过ViewGroup和View的组织形成最终的用户界面。viewGroup中有viewGroup和view,view中不能再包含其他的view.在系统中viewGroup通过mChildren记录了子view的节点数组,view通过mParent记录了父view的信息。这样android系统通过一个view树的方式就可以实现对界面view的管理。接下来我们就看看view的功能管理。
     view的功能无非就是显示和事件响应。而view的显示主要设计到view的三个主要绘制阶段,onMeasure,onLayout,onDraw,分别用来测量控件的大小,设置控件相对父控件的位置,以及最终的控件绘制过程。详细的步骤可以查看本博客之前关于控件绘制的文章。对于控件的事件响应,其实涉及到事件的拦截和处理两个步骤,一个view要响应用户事件首先要通知系统我们要接受用户的事件,然后才是事件的处理,除了这两点之外由于系统的view是以view树的方式组织在一起的,所以必然涉及到事件的分发已经事件的传递流程(对比树结构的广度优先和深度优先遍历)。那么android系统是通过何种方式来实现这些呢?
     与view的绘制类似,android控件的事件处理也分为三个阶段diapatchTouchEvent,onInterceptTouchEvent和onTouchEvent,分别对应于事件的分发,拦截和处理,android系统中如果父view没有拦截事件并处理事件那么事件就会传递到子view,并让子view的三个事件处理函数来决定是否处理这个事件(以隧道式的方式来传递事件),android系统巧妙的使用了责任链的设计模式来让view处理事件。保证了每次事件可以从外层根view到内层的子view都有机会决定是否处理以及如何处理事件。
      说完Activity,再来看看service。谈到service就不得不说说本地service(通过getSystemService可以获得的service)和我们在应用中创建的service.可以说正是framework提供的一系列service,让上层应用开发变得很方便,通过ActivityManagerService,WindowManagerService,PackageManagerService等Android系统的核心service,我们可以实现和系统方面的绝大多数交互,以PackageManagerService为例子,通过PackageManager保存的IpackageManager内部类stub的代理对象和binder交互,同时PackageMangerService通过集成IPackageManger.Stub类也与binder交互,最终通过binder,实现了客户端与服务端IPC交互,而我们在应用中创建的service最终也是通过binder的中转来为我们服务。
      现在,让我们再回到概念空间这个问题。Android系统为我们提供了四大组件的概念,让程序员忽略应用的概念,甚至彻底抛弃了进程的概念,通过Intent,封装了我们的想要得到的服务,然后请求具体的组件来为我们完成服务,简单的命令模式,却大大方便了请求端的操作,也降低了系统的耦合度。正因为组件概念的重要性,所以intent的请求与过滤涉及到的权限是组件级别的,系统中同一Manifest中的组件默认是与应用的包名相关联的,因此,我们在短信中点击一个url链接,系统会弹出对话框让我们选择提供相应功能支持的组件所对应的应用。
      Android系统很庞大,想要深入的了解android系统的实现绝不是通过一篇文章就可以说清楚的,我们想要了解android的系统实现是为了开阔我们的视野,更好的使用android系统为我们提供的服务。本文的目的就是以点带面,让我们对系统的framework的实现由概念性的了解。最后文中可能有些概念错误或描述不准确的地方,希望大家可以多多指教。

1 0