• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
 






高煥堂.EIT

 
 

Powered by 博客园
博客园 | 首页 | 新随笔 | 联系 | 订阅 订阅 | 管理

业务框架与Android框架的三种整合策略

By 高焕堂 2010/1/2   

                                                                                                               

 

业务框架与Android框架的三种整合策略

      在本文里,以一个小框架为例,说明如何将该小框架整合到Android大框架里。由于Android框架具有高度弹性,所整合的形式或策略有许多种。本文也举例说明常见的三种整合策略。

 

1. 前言

    Android是「一般用途」的大框架,就像一座万里长城。于此,将说明如何将我们所设计的「特殊领域」(Domain-Specific)小框架,融入到Android大框架里。特殊领域的小框架就如同北京城或南京城。一般用途大框架的内涵包括:UI表现框架、远距服务(Remote Service)框架等;而特殊领域小框架的内涵则包括:扑克牌游戏框架、3D游戏框架、GPS服务框架、Flash-based的动漫框架等。融入越多的特殊领域框架,就越加充实了Android大框架的内涵,能大幅降低Android应用程序开发者的负担,加快AP的开发速度。

 

2. 小框架范例:一个简单的Java程序框架

  • 框架设计

     这是一个简单的框架,并可以在纯Java环境里执行。此框架里只含有一个基类(Super class),名称是:Organizer。AP开发者可基于这个基类而衍生出myOrganizer子类,以及JMain启动类别。所以框架里含有Organizer类别;而AP里则含有myOrganizer和JMain两个类别。如下图所示: 

 

 图1、简单的框架范例 

  • 范例程序码

    在Eclipse上建立一个新Project如下: 

★ Framework部分

     这个简单框架只含有Organizer基类,其程序码为:

//Organizer.java

package Framework; 

public abstract class Organizer {

      private String[] list;

      public String[] getItems(){

               int count = onCount();

               list = new String[count];

               for( int i=0; i< count; i++){

                      list[i] = onItem(i);

                 }

              return list;

}

protected abstract int onCount();

protected abstract String onItem(int k);

} 

其onCount()和onItem()两个抽象函数,表现出基类与子类的界面。getItems()函数则提供给JMain类别来使用。

 

★ 应用程序(AP)部分

     AP开发者撰写myOrganizer子类,其程序码如下:

//myOrganizer.java

package myAP;

import java.util.ArrayList;

import Framework.Organizer; 

public class myOrganizer extends Organizer {

          private ArrayList<String> coll;

          public myOrganizer(){

                   coll = new ArrayList<String>();

                   coll.add("Lion");    coll.add("Rabbit");

                   coll.add("Cat");     coll.add("Horse");

               }

           @Override protected int onCount() {

                  return coll.size();

              }

            @Override protected String onItem(int k) {

                  return coll.get(k);

              }

} 

其myOrganizer子类实作了onCount()和onItem()两个函数。基类Organizer会反向呼叫这两个函数来取得coll里的数据。 

// JMain.java

package myAP;

import Framework.Organizer; 

public class JMain {

  public static void main(String[] args) {

            Organizer ad = new myOrganizer();

            String[] items = ad.getItems();

     for(int i=0; i<items.length; i++)

      System.out.printf("%s\n", items[i]);

   }

 }

    当上述的Java范例程序的撰写、测试都完成了,就能进行下述的动作,将此小框架纳入Android大框架里。 

 

3. 如何整合大、小框架:实现策略之1

        为何我们要将所设计的小框架融合(或整合)到Android大框架呢? 其可能目的有二:

  • 把Android大框架当成小框架的开发板。因为Android大框架是可以执行的环境,内含许多立即可用的SDK、类库组件和其它机制,都是活生生可用的资源,非常有利于小框架的开发和测试。  
  • 真正想融入Android大框架来扩充Android的内涵。由于Android是具有良好弹性的大框架,让我们能弹性选择较美好的融入途径或策略。 

于此,选择一种比较单纯的途径,将小框架与Android的UI框架直接衔接、相互整合起来。    

  • 框架设计

    在Android的UI框架里,有个Activity基类。于是,从它衍生出myActivity子类,由myActivity来替代上图1里的JMain类别角色,如下图2所示: 

 

 图2、最简单的整合形式 

    其融入的步骤是:

  • 在Android的SDK开发环境里建立一个新的Project。
  • 将上述范例的Organizer机类和myOrganizer子类,汇入新Project里。
  • 撰写myActivity子类。如下所示的Android Project:

     

  • 范例程序码

★ Framework部分

    这个Organiser基类与上述范例listEX-02是一样的,如下: 

// Organizer.java

package Framework;

public abstract class Organizer {

private String[] list;

 

public String[] getItems(){

int count = onCount();

    list = new String[count];

     for( int i=0; i< count; i++){

     list[i] = onItem(i);

        }

     return list;

}

protected abstract int onCount();

protected abstract String onItem(int k);

} 

★ 应用程序(AP)部分

    这个myOrganiser子类与上述范例listEX-02是一样的,如下:

//myOrganizer.java

package com.misoo.pkzz;

import java.util.ArrayList;

import Framework.Organizer;

 

public class myOrganizer extends Organizer {

private ArrayList<String> coll;

public myOrganizer(){

coll = new ArrayList<String>();

coll.add("Lion"); coll.add("Rabbit");

coll.add("Cat"); coll.add("Horse");

}

@Override protected int onCount() {  return coll.size(); }

@Override protected String onItem(int k) {  return coll.get(k);  }

} 

    基于Android框架里的Activity基类,就能撰写myActivity应用子类,其程序码如下: 

//myActivity.java

package com.misoo.pkzz;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.AdapterView.OnItemClickListener; 

public class myActivity extends Activity implements OnItemClickListener {

       private ArrayAdapter<String> ad;

       private myOrganizer og; 

      @Override 

       public void onCreate(Bundle icicle) {

             super.onCreate(icicle);

             og = new myOrganizer();

             setContentView(R.layout.main);

             ListView lv = new ListView(this);

             ad = new ArrayAdapter<String>

                          (this, android.R.layout.simple_list_item_1, og.getItems());

             lv.setAdapter(ad);

             lv.setOnItemClickListener(this);

             setContentView(lv);

           }

     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

                 if(arg2 == 0)   

                        setTitle(((TextView)arg1).getText());

                 else if(arg2 == 1) finish();

          }

 } 

  • 这个AP里含有myActivity和myOrganizer两个子类。在编译阶段,这两个子类会与框架里的基类合并起来,一起组成一个完整的应用程序(AP)。
  • 然后,藉由Android环境来执行此AP。执行结果如下图:

      

  • 这表示小框架的运作是正确的,而且与Android框架也整合成功了。 

4. 如何整合大、小框架:实现策略之2

       从上一个Section里的图2,可以看到:在AP里是由myActivity来诞生myOrganizer的对象。此时引发了myActivity与myOrganizer之间的相依性(Dependency)。就是:万一myOrganiser类别名称有所更动时,也必须更改myActivity类别。在Android框架里有个Service基类,除了可消除myActivity与myOrganizer之间的相依性之外,还可以创造Service的共享性。[歡迎光臨 高煥堂 網頁: http://www.cnblogs.com/myEIT/ ]

      于是,可以设计出不一样的整合架构如下图:

   

  图3、擅用Android的Service机制来进行整合 

        兹以实际程序码来实现上图3的整合策略。在Eclipse上建立一个新Project如下: 

  

  • 范例程序码

★ Framework部分

  这个Organiser基类与上述范例listEX-03是一样的,如下:

★  应用程序(AP)部分

     在此AP里新定义了IListener接口和myService子类。这个IListener接口的用途是:让myService类别能返回呼叫到myActicity,将某些数据回传给myActivity。这个myOrganiser子类与上述范例listEX-03是一样的。基于Android框架里的Activity基类,就能撰写myActivity应用子类。兹以实际程序码来实现整合策略之2。 

==》范例程序码 

 

★  说明部分

指令:

     Intent svc = new Intent(this, myService.class);

     startService(svc); 

启动了myService服务,然后由框架反向呼叫myService.Create()函数。此时执行到myService.Create()里的指令:

     og = new myOrganizer();

     plis.update(og.getItems()); 

就诞生myOrganizer对象,并呼叫其getItems()函数,然后透过IListener接口而回传数据给myActivity。此程序执行时,首先呈现如下画面:

  

    按下<Run>按钮时,就呈现出如下画面:

  

    这表示此项整合形式是可行的。

 

5. 如何整合大、小框架:实现策略之3

       在上述的实现策略之2里,所有的类别(对象)都在同一个进程(Process)里执行。在Android框架里有个Binder基类,其提供了IBinder接口,可以支持「跨进程沟通」(Inter-Process Communication, 简称IPC)。如果你希望myOrganizer与myActivity分别在不同的进程里执行的话,可以善用Binder基类来建立远距的IPC沟通接口。如下之架构图:

 

 

  图4、擅用IPC的整合形式 

    兹以程序码来实现上图4的架构。

  •  范例程序码

在Eclipse上建立一个新Project如下: 

     

兹以程序码来实现上图4的架构,完整的程序码如下所示: 

// AndroidManifest.XML

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.misoo.pk01"

      android:versionCode="1"

      android:versionName="1.0.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".myActivity"

                  android:label="@string/app_name">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <service android:name=".myService" android:process=":remote">

            <intent-filter>

                <action android:name="com.misoo.pk01.REMOTE_SERVICE" />

            </intent-filter>

        </service>

     </application>

</manifest> 

     个的XML档案指示myService必须在不同的进程里执行。 

            ★ Framework部分--  这个Organiser基类与上述范例listEX-04是一样的。

            ★  应用程序(AP)部分--  这个myOrganiser子类与上述范例listEX-03是一样的。 

   框架里的Service基类会反向呼叫到myService子类的onCreate()函数,就诞生了myBinder子类的对象。随后,框架里的Service基类会反向呼叫到myService子类的onBind()函数,就将myBinder对象的IBinder回传给myActivity子类的对象。最后撰写myActivity子类来处理UI的事件。此程序执行结果与上一范例ListEX-04是一样的。

 ==> 范例程序码 

 

 6. 结语

        Android是大框架,如果搭配上许许多多的特殊领域的小框架,就能大幅充实Android框架的内涵。当Android框架更为精致、更为充实了,基于这框架而进行的应用程序将更为简单,则AP开发的工作成效会大幅提高。◆ 

[Go Back]

 

发表于 2013-11-13 14:38  高煥堂.EIT  阅读(441)  评论(0)    收藏  举报
 
刷新页面返回顶部