Activity与Service间的通信主要是通过绑定服务来得到服务返回的Binder对象,通过这个Binder对象来和服务进行通信,这个Binder对象可以是Interface、AIDL和Messenger。
这篇文章主要通过代码来介绍如何使用Messenger进行Activity与Service间的通信。
1、Activity的代码:
public class MainActivity extends Activity {
private Button bind;//绑定服务按钮
private Button send;//发送消息按钮
private Messenger messenger;
private Messenger sendMessenger;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
System.out.println("Activity received");
super.handleMessage(msg);
}
};
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
messenger = new Messenger(binder);//得到服务中的messenger
System.out.println("ServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bind = (Button) findViewById(R.id.bindButton);
send = (Button) findViewById(R.id.sendButton);
bind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, MessengerService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
});
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessenger = new Messenger(handler);//创建一个本地messenger对象
Message msg = Message.obtain(null, 0);//新建一条消息
msg.replyTo = sendMessenger;//replyTo可以理解为消息中的发件人
try {
messenger.send(msg);//发送消息给服务
System.out.println("send");
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
}
2、Service的代码:
public class MessengerService extends Service {
Messenger replyMessenger = null;
Messenger messenger = null;
@Override
public IBinder onBind(Intent arg0) {
messenger = new Messenger(handler);//创建一个messenger
return messenger.getBinder();//将messenger作为Binder返回
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
System.out.println("Service received");
replyMessenger = msg.replyTo;//得到Activity中的messenger
Message message = Message.obtain(null, 0);//新建一条消息
try {
replyMessenger.send(message);//向activity发送消息
System.out.println("replay");
} catch (RemoteException e) {
e.printStackTrace();
}
}
super.handleMessage(msg);
}
};
}