android平台框架原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android平台框架原理相关的知识,希望对你有一定的参考价值。

参考技术A

  android的系统架构采用了分层架构的思想,如图1所示。从上层到底层共包括四层,分别是应用程序程序层、应用框架层、系统库和Android运行时和Linux内核。

  每层功能简要介绍如下:

  该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。

  该层是Android应用开发的基础,开发人员大部分情况是在和她打交道。应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。在Android平台上,开发人员可以完全访问核心应用程序所使用的API框架。并且,任何一个应用程序都可以发布自身的功能模块,而其他应用程序则可以使用这些已发布的功能模块。基于这样的重用机制,用户就可以方便地替换平台本身的各种应用程序组件。

  系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。

  包括核心库和Dalvik虚拟机。

  既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如android.os、android.net、android.media等等。

  Dalvik虚拟机是一种基于寄存器的java虚拟机,所支持的字节码(ByteCode)是“dex”文件(Dalvik Executable)
  Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。

  核心系统服务依赖于Linux内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。

  Android的系统架构采用分层架构的思想,架构清晰,层次分明,协同工作。

  Android的系统架构不仅从宏观上认识了Android系统,同时,也给我们的学习与实践指明了方向。

  找准切入点,对我们的学习和工作,无疑是有非常大的帮助的。

  每个开发者估计都纠结过 平台 框架 的概念,特别是对新手而言, 平台 框架 似乎总是前辈们口头上惯用的、玄而又玄的名词。
  实际上,我们可以把 平台 理解为舞台,其强调了事物的支持特性,有如舞台具有支撑舞者在其上进行表演的特性。
  同样,Android 平台 具有支持Android应用程序运行的特性,具体表现在运行时(Runtime)环境和接口,API。

   框架 可以理解为骨架,其强调了事物的可重用性。众所周知,人类无论高矮胖瘦、美丑强弱,其骨架都是相似的。反之,使用一个人类的骨架模型,可以塑造出不同的人体模型。
  在软件开发过程中,使用 框架 可以开发出界面各异的、某一类应用程序。例如,输入法,有搜狗输入法、国笔输入法、百度输入法……等各有异同的应用程序。
   框架 的具体表现为一组协同工作的类,如界面组件类、事件处理类、网络通信类等。借助 框架 ,开发者可以高效地开发出应用程序。

  简而言之, 框架 帮助应用程序的开发, 平台 支持应用程序的运行, 框架 建立在 平台 之上。

  首先,理解两个概念 抽象和衍生

  框架里的函数能够呼叫应用程序之中的函数,通俗的讲是前辈呼叫晚辈,框架先于程序诞生,称之为前辈。程序在框架的基础上诞生,所以称为晚辈。前辈呼叫晚辈,会产生下述几种效果

  应用框架的典型双向沟通情形

  从上图可以看到,框架和应用程序之间,主动权掌握在框架手里,框架决定如何呼叫应用程序中的函数。

04mvc框架原理(8days)02

框架

实现业务逻辑的基础代码,主要包括:

一:项目的架构模式(MVC)

二:常用的公共操作代码(MySQLDB,文件上传,图片处理,分页,字符串处理,session处理)

应该将以上的代码总结出来,下次可以直接使用!

?

?

几个项目的概念

?

项目功能:

前台:负责展示项目具体功能的平台称之为前台!

后台:负责功能管理,数据管理的平台称之为后台!

?

工作内容:

程序:负责网站的业务逻辑主体功能实现的工作,程序!(PHP,SQL,JS)

美工:负责设计页面样式!(HTML,CSS,JS)

?

?

由后台的数据添加(管理),前台的数据展示!

?

?

建立主机

增加独立的站点主机,管理当前的项目。通过虚拟主机完成!

技术分享

?

通过 域名 shop.100.com来访问!

技术分享

?

?

提取框架代码

总体项目分成:1具体业务逻辑实现+2公共的基础框架代码

技术分享

?

应用程序的MVC分层

技术分享

?

?

将之前所完成mvc代码,分散到上面的功能目录内:

?

增加入口文件

需要修改载入控制器文件的路径!

技术分享

技术分享

?

增加相应的控制文件

shop/app/controller/MatchController.class.php

技术分享

完成控制器类与一个列表的动作方法:

shop/app/controller/MatchController.class.php

注意其中的模型文件路径与视图文件路径:

技术分享

?

增加比赛模型文件

app/model/MatchModel.class.php

技术分享

完成模型类,别忘了加载基础模型类的路径:

基础模型类,应该放在框架的基础代码:

技术分享

?

增加基础模型类

framework/Model.class.php

技术分享

增加相应的初始化方法:

载入了MySQLD类,修改载入路径

mysqlDB也应该放置在Framework内!

技术分享

?

增加MySQLDB类文件

framework/MySQLDB.class.php

实现即可!

技术分享

?

?

增加显示层模板

app/view/match_view.html

技术分享

?

?

?

技术分享

?

?

平台的分布,platform

前台和后台

?

平台间:业务逻辑不同但是数据应该一致的

?

典型的就是:

模型 的概念是部分前后台的(平台)

控制器视图 的部分 是被划分成 平台的概念!

因此:控制器:

技术分享

和 视图:

技术分享

?

但是,模型内,是不用划分的!

技术分享

?

平台参数,p

此时需要增加一个请求参数,用于标识当前所请求的平台是哪个!

?

index.php?p=front&c=Match&a=list 访问前台的Match控制器的list动作!

index.php?p=admin&c=Goods&a=add 访问后台的Goods控制器的add动作

技术分享

?

在入口文件内,增加对p参数的处理:

Index.php

技术分享

?

?

最后,在控制器的动作中载入视图层模板,也需要控制平台!

app/controller/front/MatchController.class.php

技术分享

?

布局总结

项目:做了三次分割:

  1. 业务逻辑与框架基础代码!(app,Framework)
  2. mvc的分割!(app/controller, app/model, app/view)
  3. 平台的分割!(app/controller/front, app/controller/admin, app/view/front,app/view/admin)

?

url:需要三个请求参数:

p:请求的平台。(目录名)

c:请求的控制器名。(控制器类名,类名首字母大写)

a:请求的动作名。(方法名)

技术分享

?

?

目录结构

shop/????项目的根目录

????app/????????应用程序目录

????????controller/????控制器目录

????????????????front/????前台控制器

????????????????admin/????后台控制器

????????model/????????模型目录

????????????模型文件

????????view/????视图目录

????????????front/????前台视图

????????????admin/????后台视图

????Framework/ 框架代码目录

????????Model.class.php????基础模型类

????????MySQLDB.class.php????数据库操作类

?

?

后台登陆功能

?

登陆表单展示,login

控制器

在后台增加一个操作管理员相关功能的控制器类!

app/controller/admin/AdminController.class.php

并增加一个显示登录表单的动作:

loginAction()

技术分享

模型

没有模型参与!

视图

增加一个模板,暂时表单!

app/view/admin/login.html

所有的html样式,直接参考,ecshop的成果!

需要注意的地方:

表单的请求地址:

技术分享

还需要将css与image拿来:

技术分享

修改路径:

技术分享

技术分享

?

?

?

管理员数据验证,signin

增加一个管理员表

先增加库:

再增加管理员表:

技术分享

?

在开发时,可以使用 其他的客户端,做数据库的管理!

常见:

桌面形式:

mysql-front

技术分享

?

navicat

?

?

web端的

phpmyadmin

php代码实现的完成数据库管理的php产品!

下载,解压,放在可以被web浏览器访问到的位置即可!

技术分享

?

访问即可!

技术分享

留意,phpmyadmin默认是通过使用 mysqli 扩展完成数据的操作的!(不开启也可以,使用mysql)

技术分享

?

增加测试数据

技术分享

?

?

?

?

控制器

app/controller/admin/AdminController.class.php

signinAction()

技术分享

模型

为 it_admin表增加一个模型!

app/model/AdminModel.class.php

技术分享

别忘了修改下 项目的数据库名!

framework/Model.class.php

技术分享

视图

不需要视图!

?

?

?

增加自动加载类文件

增加一个__autoload函数即可!

考虑放在入口文件内:因为所有的请求都要通过入口文件!

?

此时需要考虑 类名与类所在文件的关系!

类????????????????目录

控制器类

AdminController????app/controller/admin/

模型类

AdminModel????????app/model/

?

基础框架类

Model????????????framework/

MySQLDB????????framework/

?

总结规律:

以Controller结尾的类名,都是控制器类,去app/controller

以Model结尾的都是模型类,去app/model加载

?

一些特例:

Model,去framework

MySQLDB,去framework

?

在完成 类名 推出 类所在的文件时,两种情况:1,有固定规律的载入!(模型类和控制器类);2,没有固定规律数量有限的特例!

?

因此,典型的自动加载文件代码:

判断特例

技术分享

再判断规律,

利用字符串函数,截取后边几个字符!

技术分享

控制器类:

技术分享

?

?

此时 将所有加载类:

index.php

技术分享

AdminController.class.php

技术分享

AdminModel

技术分享

Model.class.php

技术分享

?

?

路径管理

项目中,使用常量的形式管理路径!

使用绝对路径!

尽量自动获得!

?

首先获得项目的根目录,其他目录依据项目的根目录拼凑出来!

?

(还没有__DIR__时);

取得__FILE__中的路径部分!利用一个函数 dirname来获取一个目录中的目录部分!

技术分享

?

?

也是在入口文件中完成:index.php

技术分享

?

如果目录之前进行拼凑,一定会使用到目录分隔符!(PATH_SEPARATOR,路径分隔符) ,不同的操作系统对目录分隔符的支持是不同的!

windows 支持 \\(反斜杠) 和 /(斜杠),默认是反斜杠\\。

linux 支持 / (斜杠)

因此程序中多见 /斜杠!

除此,还有一个更好的方法:

利用 预定义 常量:DIRECTORY_SEPARATOR,目录分隔符!

技术分享

因此,最好目录的分隔符应该使用常量代替!

技术分享

在定义目录常量时,最好保证所有的目录是否有分隔符一致!

选择每个目录常量后,都增加 目录分隔符!

为了方便,将当前的平台也定义成常量:

技术分享

?

使用该常量:

自动加载方法:

技术分享

载入视图模板:

技术分享

?

预习

session,cookie

验证码,简单图片处理!

以上是关于android平台框架原理的主要内容,如果未能解决你的问题,请参考以下文章

Android 平台电容式触摸屏的驱动基本原理

可能是Android平台上最快的图片压缩框架

ionic框架Android平台,添加第三方module引用

Flutter跨平台框架体验

Android程序员的Flutter学习笔记

Android平台上的Linphone学习