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]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步