Android入门:绑定本地服务

来源:互联网 发布:姗姗手帐小铺 淘宝 编辑:程序博客网 时间:2024/06/10 01:10

一、绑定服务介绍


前面文章中讲过一般的通过startService开启的服务,当访问者关闭时,服务仍然存在;
但是如果存在这样一种情况:访问者需要与服务进行通信,则我们需要将访问者与服务进行绑定;

如果使用Context.bindService()方法启动服务,则在服务未创建时,系统会调用服务的onCreate()方法,接着调用onBind()方法,这时就访问者与服务已经绑定;
如果多次调用bindService()多次绑定服务,则不会有副作用(导致多次绑定);

绑定服务的运行流程如下图所示:



二、Bind Service 核心代码



绑定与解绑定服务


(1)Context.bindService(Intent service,ServiceConnection conn,BIND_AUTO_CREATE);//绑定服务
(2)Context.unbindService(ServiceConnection conn);//解除绑定服务


ServiceConnection


ServiceConnection为一个接口,用于绑定和解绑定IBinder,因此需要创建一个类实现它;
class XxxServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {//service为在onBind返回的IBinder
//绑定Binder对象
}
@Override
public void onServiceDisconnected(ComponentName name) {
//解绑定Binder对象
}
}


Service类


class XxxService extends Service{
private IBinder binder = newXxxBinder();
public IBinder onBind(Intent intent){
return binder;
}
public int fun(int a){//服务提供的方法,但是不能直接调用
...
}
private class XxxBinder extends Binder implements IXxxBinder{//面向接口编程
public return fun1(int a){//对外暴露的API
return fun(a);//内部调用Service的方法
}
}
}


三、BindService案例



场景:服务提供了加法运算的接口,Activity需要调用服务提供的加法运算方法,并返回结果;

效果说明:




MainActivity.java

[java] view plaincopy
  1. package com.xiazdong.bindservice;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ComponentName;  
  5. import android.content.Intent;  
  6. import android.content.ServiceConnection;  
  7. import android.os.Bundle;  
  8. import android.os.IBinder;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.EditText;  
  13. import android.widget.TextView;  
  14.   
  15. public class MainActivity extends Activity {  
  16.     private EditText op1,op2;  
  17.     private Button button;  
  18.     private TextView result;  
  19.     private IAddOp binder ;//使用接口IAddOp  
  20.     private ServiceConnection conn = new AddOpServiceConnection();  
  21.     private OnClickListener listener = new OnClickListener(){  
  22.         @Override  
  23.         public void onClick(View v) {  
  24.             int number = binder.addOpService(Integer.parseInt(op1.getText().toString()), Integer.parseInt(op1.getText().toString()));  
  25.             result.setText("result="+number+"");  
  26.         }  
  27.     };  
  28.     @Override  
  29.     public void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.main);  
  32.         op1 = (EditText)this.findViewById(R.id.op1);  
  33.         op2 = (EditText)this.findViewById(R.id.op2);  
  34.         result = (TextView)this.findViewById(R.id.result);  
  35.         button = (Button)this.findViewById(R.id.button);  
  36.         button.setOnClickListener(listener);  
  37.         Intent service = new Intent(this,AddOpService.class);  
  38.         this.bindService(service, conn, BIND_AUTO_CREATE);  
  39.     }  
  40.     private class AddOpServiceConnection implements ServiceConnection{  
  41.         @Override  
  42.         public void onServiceConnected(ComponentName name, IBinder service) {//绑定服务时调用  
  43.             binder = (IAddOp)service;  
  44.         }  
  45.         @Override  
  46.         public void onServiceDisconnected(ComponentName name) {//解绑定服务时调用  
  47.             binder = null;  
  48.         }  
  49.     }  
  50. }  

AddOpService.java

[java] view plaincopy
  1. package com.xiazdong.bindservice;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.Binder;  
  6. import android.os.IBinder;  
  7.   
  8. public class AddOpService extends Service {  
  9.     private IBinder binder = new AddOpBinder();  
  10.       
  11.     public int add(int a,int b){        //服务提供的方法  
  12.         return a+b;  
  13.     }  
  14.     @Override  
  15.     public IBinder onBind(Intent intent) {  
  16.         return binder;  
  17.     }  
  18.   
  19.     private class AddOpBinder extends Binder implements IAddOp{  
  20.         public int addOpService(int a, int b) { //binder对外暴露一个API调用服务提供的方法  
  21.             return add(a,b);  
  22.         }  
  23.     }  
  24. }  


IAddOpService.java

[java] view plaincopy
  1. package com.xiazdong.bindservice;  
  2.   
  3. public interface IAddOp {  
  4.     public int addOpService(int a,int b);  
  5. }  


0 0
原创粉丝点击