绑定本地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之间的通信。

作者:潘文霞
原文地址:点击这里

猜你喜欢

转载自blog.csdn.net/fjnu_se/article/details/80715332