BindService 允许其它的组件(比如Activities)绑定到这个Service上,可以发送请求,也可以接受请求,甚至进行进程间的通话。Bound service 仅仅在服务于其它组件时存在,不能独自无限期的在后台运行。
当创建一个能提供绑定功能的服务时,我们必须提供一个IBinder对象,客户端能使用这个对象与服务进行交互。在Android中有三种方式定义方式:
1.扩展Binder类
2.使用Messenger
3.使用AIDL (Android Interface Definition Language)
通过扩展Binder类创建创建BoundServices
步骤:
a.在Service类中,创建一个Binder实例
包含客户端能调用的公共方法
返回当前服务对象
b.在onBind()方法中返回Binder实例
c.在客户端,从onServiceConnected()方法中获得Binder实例,
****************************************************** 简单示例***************************************************************************************************************
1、MainActivity.xml
中添加两个按钮
Button startbtnButton
Button stopbtnButton
2、MainActivity.java
package com.tengern.bindservicedemo;
import com.tengern.bindservicedemo.BinderServiceDEMO.MyBinder;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
//private static final String TAG="MainActivity";
protected boolean isConnected;
private Button startbtnButton=null;
private Button stopbtnButton=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startbtnButton=(Button)findViewById(R.id.btnstart);
stopbtnButton=(Button)findViewById(R.id.btnstop);
startbtnButton.setOnClickListener(listener);
stopbtnButton.setOnClickListener(listener);
}
private OnClickListener listener=new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnstart:
bindService();
break;
case R.id.btnstop:
unbindService();
break;
default:
break;
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
protected void unbindService() {
// TODO Auto-generated method stub
if (isConnected) {
unbindService(conn);
}
}
protected void bindService() {
// TODO Auto-generated method stub
Intent intent=new Intent(MainActivity.this, BinderServiceDEMO.class);
bindService(intent, conn,BIND_AUTO_CREATE);
}
private ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
isConnected=false;
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {
// TODO Auto-generated method stub
MyBinder myBinder=(MyBinder)binder;
BinderServiceDEMO serviceDEMO=myBinder.getservice();
serviceDEMO.Mymethod();
isConnected=true;
}
};
}
3、BinderServiceDEMO.java继承 Service
package com.tengern.bindservicedemo;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class BinderServiceDEMO extends Service {
private static final String TAG="BinderServiceDEMO";
/*
* 在Service类中,创建一个Binder实例
* 包含客户端能调用的公共方法
* 返回当前服务对象
*/
private MyBinder binder=new MyBinder();
public class MyBinder extends Binder {
/*
* 返回当前服务对象
* */
public BinderServiceDEMO getservice(){
return BinderServiceDEMO.this;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return binder;
}
/*
*自定义的方法实现一些组件的功能
*/
public void Mymethod() {
Log.i(TAG, "Mymethod start.....");
}
}
4、Androidmanifest.xml
中添加service服务
<service
android:name=".BinderServiceDEMO"/>
和activity同级