深入Android架构(从线程到AIDL)_24 活用IBinder接口于近程通信02
3、 留意线程的角色
- 在上述的范例程序,都是由主线程所执行的。 由主线程执行所有的调用。 如下图:
也可以创建小线程执行对IS接口的调用
- 例如将上述onClick()函数内容改写为:
public void onClick(View v) { th1 = new Thread(this); th1.start(); } public void run() { //……. isv.f1() }
就诞生小线程去调用IS接口了,如下图:
程序代码
// ILoad.java
// ………
interface ILoad {
boolean loadImage();
boolean cancel();
}
// myService.java
// ………
public class myService extends Service implements ILoad{
private final IBinder mBinder;
@Override public IBinder onBind(Intent intent) {
return mBinder;
}
@Override public void onCreate(){
super.onCreate();
mBinder = new myBinder();
}
public class myBinder extends Binder{
ILoad getService(){
return myService.this;
}
}
@Override public boolean loadImage() {
// loading image from cloud
}
@Override public boolean cancel() {
// cancel loading
}
}
// myActivity.java
// ……….
public class myActivity extends Activity implements OnClickListener {
ILoad isv;
Thread th1;
// ……..
@Override public void onCreate(Bundle savedInstanceState) {
// ………
Intent intent = new Intent(this,myService.class);
bindService(intent, mConnection,Context.BIND_AUTO_CREATE);
}
private ServiceConnection mConnection = new ServiceConnection(){
@Override public void onServiceConnected(ComponentName className, IBinder ibinder) {
myBinder ib = (myBinder)ibinder;
isv = ib.getService();
}
@Override public void onServiceDisconnected(
ComponentName arg0) { }
};
@Override public void onClick(View v) {
switch( v.getId() ){
case 101:
th1 = new Thread(this);
th1.start();
break;
case 102:
isv.cancel();
break;
default:
break;
}
}
public void run() {
isv.loadImage();
}
}
- 在这个范例里,活用Android框架提供的Binder基类和IBinder接口。
- 然后配合myService的onBind()函数,将myBinder的IBinder接口回传给myActivity。
- 接着, myActivity并不透过 IBinder接口来调用myService的服务。而是直接调用了myService的IS接口。
- 此外,可擅用小线程来执行比较耗时的服务。