实现策略之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 ~