1.app服务端
MessageService.java
public class MessageService extends Service {
/**
* 用于接收其他应用程序传递过来的消息,
* 信使可以封装Handler, 封装之后就可以接收数据
*/
private Handler mReceiveHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
int what = msg.what;
switch (what) {
case 998: // 打印数据
// !!! 如果Handler用于信使的消息接收,
// 那么 obj 对象必须是 Parcelable对象 !!!
Object obj = msg.obj;
Log.d("Service", "obj = " + obj);
if (obj instanceof Bundle) {
Bundle bundle = (Bundle) obj;
int id = bundle.getInt("id");
Log.d("Service", "id = " + id);
}
Messenger replyTo = msg.replyTo;
if (replyTo != null) {
// 消息处理完成,需要返回结果和状态
Message message = Message.obtain();
message.what = 777;
try {
replyTo.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
break;
}
}
};
public MessageService() {
}
@Override
public IBinder onBind(Intent intent) {
// 使用信使 Messenger 来返回就可以了
return new Messenger(mReceiveHandler).getBinder();
}
}
2.messengerclient应用程序
MainActivity.java
public class MainActivity extends AppCompatActivity implements ServiceConnection {
// 发送消息用的
private Messenger mSendMessenger;
private Handler mReceiveHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
int what = msg.what;
Toast.makeText(MainActivity.this, "结果: " + what, Toast.LENGTH_SHORT).show();
}
};
// 等待服务返回数据,接收
private Messenger mReplyMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mReplyMessenger = new Messenger(mReceiveHandler);
// 绑定远程服务
Intent intent = new Intent();
intent.setClassName(
"mobi.vhly.messengerdemo", // 程序ID
"mobi.vhly.messengerdemo.services.MessageService" // 服务类全名
);
bindService(intent, this, BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
unbindService(this);
super.onDestroy();
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 绑定的服务使用信使来返回 IBinder对象;
// 接收到IBinder对象,可以使用 Messenger信使封装, 就可以发送消息了
mSendMessenger = new Messenger(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
mSendMessenger = null;
}
public void btnSendMessage(View view) {
if (mSendMessenger != null) {
Message msg = Message.obtain();
msg.what = 998;
msg.arg1 = 999;
// 使用信使发送的必须是Parcelable接口的对象,不能够是基本数据类型
Bundle bundle = new Bundle();
bundle.putInt("id", 6);
msg.obj = bundle;
// 消息可以设置 replyTo 成员,实现 A -> B ,B收到之后,通过 replyTo对象,可以
// 把数据返回给 A
msg.replyTo = mReplyMessenger; // 用于接收消息
// 使用信使发送消息
try {
mSendMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
使用Messenger信使来实现两个application的通信。