实现策略之2 

★ Framework部分

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

//Organiser.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)部分

     在此AP里新定义了IListener接口和myService子类,其程序码如下: 

//IListener.java

package com.misoo.pk01;

public interface IListener {

public void update(String[] s);

} 

这个IListener接口的用途是:让myService类别能返回呼叫到myActicity,将某些数据回传给myActivity。程序码如下: 

//myService.java

package com.misoo.pk01;

import Framework.IListener;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

 

public class myService extends Service {

private myOrganizer og;

private static IListener plis;

     

@Override public void onCreate() {

  super.onCreate();

  og = new myOrganizer();

  plis.update(og.getItems());

  }

@Override public IBinder onBind(Intent intent) {

return null;

}

public static void setUpdateListener(IListener listener) {

  plis = listener;

}

}

 

    这个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); }

}

 

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

 

//myActivity.java

package com.misoo.pk01;

import Framework.IListener;

import android.app.Activity;

import android.content.Intent;

import android.graphics.Color;

import android.os.Bundle;

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;

 

@Override public void onCreate(Bundle icicle) {

        super.onCreate(icicle);

        ref = this;

        state_var_A = 0;

        goto_state_01();

    }

  private void goto_state_01(){

     state_var_A =1;

     show_layout_01();

     myService.setUpdateListener(new UpdateUIListener());

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

     startService(svc);

    }     

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;

 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;

}

}

//-------------------------------------------------------------

   class UpdateUIListener implements IListener {

       public void update(String[] ims) {

         items = ims;

   }

}} 

★  说明部分

指令:

     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。

~ End ~