ee ee
【思考Android技术】
請參考:Android从程序员到架构师之路课程(在线视频学习)
请进入:ADT架构师学苑
ee ee
Why,应用框架? 它"框住"什麼?
前言:在Application Market潮流下,Android平台里的各种产品都必须提供Open API给广大的第三方开发者。API设计的幕后就是框架设计。 所谓「应用」,意味着它涵有应用情境里的领域知识(Domain Knowledge)。应用框架可以是通用性的、跨硬件平台的;它也能呈现硬件平台的特殊性、差异性的。由于应用框架的核心组成元素是「应用基类(Superclass)」,它必须与其应用子类合并才能进行编译、连结出可执性的应用程序。所以应用框架有三项重要的特性:
- 必须提供原始码(Source Code)
- 必须与应用子类相同语言
- 常常是免费赠送给AP开发者
1. 应用框架的角色
传统上,API介于应用软件(Application)与系统软件(平台)之间,如下图:
图1、传统的API
为了加速应用软件的开发,逐渐将应用软件切分为两部分:
- 应用框架(Application Framework)
- 应用子类(简称AP或App)
于是,API的位置改变了,它位于上述两者之间,如下图:
图2、新潮的API
所谓「应用」,意味着它涵有应用情境里的领域知识(Domain Knowledge)。应用框架可以是通用性的、跨硬件平台的;它也能呈现硬件平台的特殊性、差异性的。由于应用框架的核心组成元素是「应用基类(Superclass)」,它必须与其应用子类合并才能进行编译、连结出可执性的应用程序。所以应用框架有三项重要的特性:
- 必须提供原始码(Source Code)
- 必须与应用子类相同语言
- 常常是免费赠送给AP开发者
如果应用框架是跨硬件平台的、通用性的,常常是由第三方开发者来提供。如果应用框架是含有硬件差异化的,常常是由硬件厂商来提供,如下图:
图3、新潮的系统平台
由于应用框架内含大量而精致的领域专业知识,可以让AP子类来继承之,可以减轻AP开发者的负担,加速应用软件的开发;因而让应用商城(Application Market)能快速成长;也扩大相关硬设备的市场和掌握商机。当应用框架与AP分离之后,它便能与系统软件结合,形成了新潮的系统平台,如下图的Android平台:
图4、Android的系统平台架构
这个新潮系统平台,往上提供API来支撑应用子类,而应用子类则提供UI来与用户(User)互动。往下则衔接到硬件服务,还能连接到远程云端服务。如下图:
图5、系统平台衔接三种服务
由于在对象导向(Object-Oriented)概念里,基类与子类之间是继承(Inheritance)关系,一般而言,在绘制UML图形时,基类大多位于上方,而子类则位于下方。所以,上图也常常绘制如下:
图6、凸显基类与子类之间的继承关系
例如,3D绘图基类与子类之间的继承关系:
图7、3D绘图框架之例
再如,3D绘图与语音辨识整合框架之例,如下:
图8、3D绘图与语音辨识整合框架之例
2. 应用框架:用来框住应用程序的架构
就像中国古代的万里长城一样,用来框住塞外游牧民族的行为。兹回顾过去的历史,没有框架的保护,Orbix系统被应用软件绑住了,如下图:
图9、回顾:1990年代初的CORBA
上图就像没有万里长程来保护关内的居民一般。再如,微软公司为了保护它的Windows操作系统,于1995年推出COM/DCOM应用框架,用来保护Windows的变动自由度,如下图:
图10、1995年的COM/DCOM
在COM/DCOM框架里,只提供接口(Interface)而没有提供基类,比较无法吸引AP开发者。于是,在2000年将其改为.NET框架,就提供了基类和接口了,如下图:
图11、2000年的 .NET框架
<<框架观点:控制中心在框架>>
-- Hollywood(好莱坞)大明星的名言:“Don’t call me, I’ll call you back.”
图12、Don’t call me
图13、I’ll call you back
4. Android应用框架里的基类
4.1 四个嫡系的基类
Android母框架里提供了4个一等公民(或称为嫡系)的基类,包括:
- Activity: 处理UI互动的事情
- Service:幕后服务(如硬件及Driver的服务)
- BroadcastReceiver: 接收讯息及事件处理
- ContentProvider: 储存共享数据,如下图所示:
图14、 Android母框架里的4个嫡系基类
基于这些基类,地头蛇就可以撰写AP子类,如下图:
图15、 强龙与地头蛇双方智慧结合了
4.2 Intent-based Programming 技术--- 嫡系应用子类之间如何互相沟通呢?
Android的4种嫡系应用子类之间如何互相沟通呢?其实很简单,就像你打手机去车行叫出租车,而不是直接到街道上叫车。你送给行一个短信或一通电话,表明你的「意图」(Intent),当车行服务员接到此意图,就依据你的意图的内含条件而去挑选最合适的车,然后派遣它去接你。于是,Android框架里所提供的Intent就扮演它们之间的沟通媒介。这4种嫡系对象都是由框架去配对及启动的,并不是组件之间透过直接呼叫而启动的。「意图」(Intent)本身是定义为一个类(Class),一个Intent对象表达一个期望(Expectation),叙述其所期望的服务或动作。
框架则根据此Intent对象之叙述,负责配对,找出相配的组件,然后将Intent对象传递给所找到的对象,于是框架的媒婆任务就完成了。因此,Intent对象扮演着媒体中介的角色。例如,提供「Activity组件àAndroid框架 à ContentProvider组件」之间互相沟通的相关信息。这种Intent沟通方式让不同人开发的套件(Package)内之类别可以轻易达成沟通。例如,有两个套件:A与B。假设它们是由不同的开发者所撰写的,当这两个套件都被下载到同一支手里执行时,就能立即互相沟通了,这是Android框架的一项重要实践技术。例如下图 :
图16、 Intent对象扮演中介角色
兹以Java代码实践如下:
// BeginReceiver.java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BeginReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent intent = new Intent(context, myActivity.class);
intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
context.startActivity( intent );
}
}
其中的Intent.FLAG_ACTIVITY_NEW_TASK就是配对条件。而代码:context.startActivity( intent ); 就将Intent对象发送给母框架里的Context,要求配对到Activity的应用子类。
[Go Back]