实现策略之3
★ Framework部分
这个Organiser基类与上述范例listEX-04是一样的。,如下:
//Organizer.java
package Framework;
public abstract class Organizer {
public int getCount(){
return onCount();
}
public String getItem(int i){
return onItem(i);
}
protected abstract int onCount();
protected abstract String onItem(int k);
}
★ 应用程序(AP)部分
这个myOrganiser子类与上述范例listEX-03是一样的,如下:
//myOrganizer.java
package com.misoo.pk01;
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);
}
}
框架里的Service基类会反向呼叫到myService子类的onCreate()函数,就诞生了myBinder子类的对象。
//myService.java
package com.misoo.pk01;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class myService extends Service {
private IBinder mBinder = null;
@Override
public void onCreate() {
mBinder = new myBinder(getApplicationContext());
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
随后,框架里的Service基类会反向呼叫到myService子类的onBind()函数,就将myBinder对象的IBinder回传给myActivity子类的对象。此myBinder子类的程序码如下:
//myBinder.java
package com.misoo.pk01;
import android.content.Context;
import android.os.Binder;
import android.os.Parcel;
public class myBinder extends Binder{
private myOrganizer og = null;
public myBinder(Context cx){ og = new myOrganizer(); }
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws android.os.RemoteException{
switch(code) {
case 0: int c = og.onCount();
reply.writeInt(c);
break;
case 1: int i = data.readInt();
String s = og.onItem(i);
reply.writeString(s);
break;
}
return true;
}
}
最后撰写myActivity子类来处理UI的事件,此子类的程序码如下:
// myActivity.java
package com.misoo.pk01;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Color;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
public class myActivity extends Activity implements OnClickListener {
private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
private ArrayAdapter<String> ad;
private String[] items;
private int state_var_A;
private IBinder ib = null;
@Override public void onCreate(Bundle icicle) {
super.onCreate(icicle);
state_var_A = 0;
goto_state_01();
}
private void goto_state_01(){
state_var_A =1;
show_layout_01();
bindService(new Intent("com.misoo.pk01.REMOTE_SERVICE"),
mConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName className) {}
public void onServiceConnected(ComponentName name, IBinder service) {
ib = service;
}
};
private void show_layout_01(){
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams param =
new LinearLayout.LayoutParams(100, WC);
param.topMargin = 5;
Button btn = new Button(this);
btn.setId(101);
btn.setText("Run");
btn.setBackgroundResource(R.drawable.x_yellow);
btn.setOnClickListener(this);
layout.addView(btn, param);
Button btn2 = new Button(this);
btn2.setId(102);
btn2.setText("Exit");
btn2.setBackgroundResource(R.drawable.earth);
btn2.setOnClickListener(this);
layout.addView(btn2, param);
this.setContentView(layout);
}
private void goto_state_02(){
state_var_A = 2;
//---------------------------------
Parcel data, reply;
try {
data = Parcel.obtain();
reply = Parcel.obtain();
ib.transact(0, data, reply, 0);
int count = reply.readInt();
items = new String[count];
for(int i=0; i<count; i++){
data = Parcel.obtain();
reply = Parcel.obtain();
data.writeInt(i);
ib.transact(1, data, reply, 0);
items[i] = reply.readString();
}
} catch (Exception e) {
e.printStackTrace();
}
//---------------------------------
show_layout_02();
}
private void show_layout_02(){
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams param =
new LinearLayout.LayoutParams(200, WC);
//--------------------------------------
ListView lv = new ListView(this);
lv.setBackgroundColor(Color.GRAY);
ad = new ArrayAdapter<String>
(this, android.R.layout.simple_list_item_1, items);
lv.setAdapter(ad);
layout.addView(lv, param);
//--------------------------------------
Button btn = new Button(this);
btn.setId(201);
btn.setText("Exit");
btn.setBackgroundResource(R.drawable.earth);
btn.setOnClickListener(this);
LinearLayout.LayoutParams param2 =
new LinearLayout.LayoutParams(100, WC);
param2.leftMargin = 5;
param2.topMargin = 50;
layout.addView(btn, param2);
setContentView(layout);
}
public void onClick(View v) {
switch(v.getId()){
case 101: goto_state_02(); break;
case 102: finish(); break;
case 201: goto_state_01(); break;
}
}
}
此程序执行结果与上一范例ListEX-04是一样的。