绑定本地Service并与之通信
当Service和访问者之间双要进行方法调用或交换数据,则应该使用bindService()和unbindService()方法启动、关闭Service。bindService()方法的完整方法签名为:bindService(Intent service,ServiceConnection conn,int flags),该方法的三个参数解释如下。
service:该参数通过Intent指定要启动的Service。
conn:该参数是一个ServceConnection对象,该对象用于监听访问者与Service之间的连接情况。
flags:指定绑定时是否自动创建Service。
当开发Service类时,该Service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地Service的情况下,onBind(Intent intent)方法所返回的IBinder对象将会传给ServiceConnection对象onServiceConnected(ComponentName name,IBinder service)方法的service参数,这样访问者就可通过该IBinder对象与Service进行通信了。
public class BinService extends Service{
private int count;
private boolean quit;
private MyBinder binder=new MyBinder();
public class MyBinder extends Binder{
public int getCount{
return count;
}
@Override
public IBinder onBind(Intent intent){
System.out.printin("Service is Binded");
return binder;
}
@Override
pubic void onCreate()
{
super.onCreate();
System.out.println("service is Created");
new Thread(){
@Override
public void run(){
while(!quit){
try{
Thread.sleep(1000)
}
catch (InterruptedException e){}
count++;
}
}
}.start();
}
@Override
public boolean onUnbind(Intent intent){
System.out.println("service is Unbinded");
return true;
}
@Override
public void onDestroy(){
super.onDestroy();
this.quit = true;
System.out.println("service is Destroyed");
}
}
该程序示范了如何在Acticity中绑定本地Service,并获取Service的运行状态。该程序的Service类需要“真正”实现onBind9()方法,并让该方法返回一个有效地IBinder对象。
public class MainActivity extends Activity{
Button bind,unbind,getServiceStatus;
BindService.MyBinder binder;
private ServiceConnection conn=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name,IBinder service){
System.out.println("--Service Connected--");
binder=(BindService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name)
{
System.out.println("--Service Connected--");
}
};
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bind=(Button) findViewById(R.id.bind);
unbind=(Button) findViewById(R.id.unbind);
getServiceStatus = (Button) findViewById(R.id.unbindgetServiceStatus);
final Intent intent = new Intent = (this,BindService.class);
bind.setOnClickListener()
{
@Override
public void onClick(View source){
bindService(intent,conn,Service.BIND_AUTO_CREATE);
}
});
unbind.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View source){
unbindService(conn);
}
});
getServiceStatus.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View source){
Toast.makeText(MainActivity.this,"Service的count值为:"+binder.getCount(),Toast.LENGTH_SHORT).show();
}
});
}
}
定义一个Activity来绑定Service,并在该Activity中通过MyBinder对象访问Service的内部状态。该Activity的界面上包含三个按钮,第一个按钮用于绑定Service;第二个按钮用于接触绑定;第三个按钮则用于获取Service的运行状态。
对于Service的onBind()方法所返回的IBinder对象来说,它可被当成该Service组件所返回的代理对象,Service允许客户端通过该IBinder对象来访问Service内部数据,这样即可实现客户端与Service之间的通信。
作者:潘文霞