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]