实现策略之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是一样的。