##Bound service 绑定服务
官方文档说明bound service有三种方式:
- 通过Binder实现
- 通过Messenger实现
- 通过AIDL实现
我们看一下第一种实现方式:
- 继承Service 并重写onBind()方法
- 在Service 定义内部类MyBinder 继承自Binder,实现相应的方法
- 在Activity绑定Service,获得service返回的binder对象
#通过绑定service获得binder的getData()方法,改变textView的值
public class MainActivity extends AppCompatActivity {
private String s;
private Button bind;
private Button unbind;
//创建ServiceConnection对象,得到返回的Binder对象
ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
ForeService.BoundBinder boundBinder=(ForeService.BoundBinder) service;
s=boundBinder.getData();
Log.e("TAG",s);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bind=(Button)findViewById(R.id.bind);
unbind=(Button)findViewById(R.id.unbind);
final TextView textView=(TextView)findViewById(R.id.textView);
bind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,ForeService.class);
bindService(intent,connection,BIND_AUTO_CREATE);
}
});
unbind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(connection);
Toast.makeText(MainActivity.this,"unbind successful",Toast.LENGTH_LONG).show();
if (!"".equals(s))
textView.setText(s);
}
});
}
}
–
public class ForeService extends Service {
@Override
public void onCreate() {
super.onCreate();
/* Notification notification=new Notification(R.mipmap.ic_launcher,"hello",System.currentTimeMillis());
Intent intent=new Intent(this,MainActivity.class);
startForeground(1,notification);*/
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
IBinder binder=new BoundBinder();
return binder;
}
class BoundBinder extends Binder {
public String getData(){
String s="hello binder from bound";
return s;
}
}
}
第二种实现通过Messenger:
客户端Activity的实现,绑定service。
public class MesActivity extends Activity {
private Button start;
private Button stop;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Messenger messenger=new Messenger(service);
Message message=Message.obtain(null,1);
Bundle bundle=new Bundle();
bundle.putString("key","from service connection");
message.setData(bundle);
try{
messenger.send(message);
}catch (RemoteException e){
e.printStackTrace();
}
Log.e("TAG","connection");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("TAG","disconnection");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.messenger_layout);
initView();
}
public void initView(){
start=(Button)findViewById(R.id.mes_start);
stop=(Button)findViewById(R.id.mes_stop);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MesActivity.this,MessenService.class);
Intent intent1=new Intent();
bindService(intent1,connection,BIND_AUTO_CREATE);
toastInfo(MesActivity.this,"bind");
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(connection);
toastInfo(MesActivity.this,"unbind");
}
});
}
public void toastInfo(Context context,String s){
Toast.makeText(context,s,Toast.LENGTH_LONG).show();
}
}
服务端service 的实现:
public class MessenService extends Service {
private Messenger messenger;
private Handler handler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what==1){
String s= msg.getData().getString("key");
Log.e("Service",s);
}
return true;
}
});
@Nullable
@Override
public IBinder onBind(Intent intent) {
messenger=new Messenger(handler);
return messenger.getBinder();
}
}
第三种实现方式,通过AIDL:
这是服务端代码:
首先创建AIDl文件,创建完成以后需要将工程build下,否则调用时报错。
interface INumberManager {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
String getNumber();
void addNumber(int a);
}
创建service文件
public class NumberManagerService extends Service {
private ArrayList<Integer> list=new ArrayList<>();
private Binder binder=new INumberManager.Stub() {
@Override
public String getNumber() throws RemoteException {
return list.toString()+"";
}
@Override
public void addNumber(int a) throws RemoteException {
list.add(a);
}
};
@Override
public void onCreate() {
super.onCreate();
list.add(1);
list.add(2);
list.add(3);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
}
这是客户端代码:
在Activity绑定服务
public class MesActivity extends Activity {
private Button start;
private Button stop;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
INumberManager iNumberManager=INumberManager.Stub.asInterface(service);
try {
iNumberManager.addNumber(12);
String s=iNumberManager.getNumber();
Log.e("NUMBER",s);
}catch (RemoteException e){
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("TAG","disconnection");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.messenger_layout);
initView();
}
public void initView(){
start=(Button)findViewById(R.id.mes_start);
stop=(Button)findViewById(R.id.mes_stop);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent2=new Intent(MesActivity.this,BookManagerService.class)
bindService(intent2,connection,BIND_AUTO_CREATE);
toastInfo(MesActivity.this,"bind");
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(connection);
toastInfo(MesActivity.this,"unbind");
}
});
}
public void toastInfo(Context context,String s){
Toast.makeText(context,s,Toast.LENGTH_LONG).show();
}
}