一、我们先来看一下API对Messenger解释:
英文解释:
Reference to a Handler, which others can use to send messages to it. This allows for the implementation of message-based communication across processes, by creating a Messenger pointing to a Handler in one process,and handing that Messenger to another process.意思就是说:Messenger与一个Handler关联,它允许被使用发送message对象;同时也允许实现基于message的
线程间的通信,这种通信是通过创建一个与该线程的handler对象关联的Messager对象和将messenger(信使)传递
至另一条线程实现的;
二、通信机制:
下面我们使用快递这个例子去说明这个方法
Activity: 信使activityMessenger,"包裹A"
Service: 信使serviceMessenger,"包裹B"
Activity -- > Service:信使A和"包裹A"一起打包发送给线程B
Service -- > Activity:获取信使A将消息传递至线程A
步骤:
activity端:
1.获取本线程的信使并与该线程的handler关联
Messenger activityMessenger = new Messenger(handler);
2.绑定服务:
Intent service = new Intent(this,MyService.class);
bindService(service, conn, BIND_AUTO_CREATE)与MyService服务建立联系
在Service端调用了onBind方法返回IBinder对象,用于获取service端信使
3.获取ServiceConnection对象,建立与服务的链接
private ServiceConnection conn = new ServiceConnection(){
public void onServiceDisconnected(ComponentName name) {
}
public void onServiceConnected(ComponentName name, IBinder service) {
//获取Service信使
serviceMessenger = new Messenger(service);
}
}
4.建立通信:
获取Message对象:Message mess = Message.obtain()
信使绑定:mess.replyTo = activityMessenger
发送Message对象:
serviceMessenger.send(mess)
----------------------------------------------------------------------------
Service端:
1.调用onBind方法绑定与activity的联系:
获取serviceMessenger对象:serviceMessenger = new Messenger(handler);
返回IBinder对象
2.调用Handle对象的handleMessage方法
获取到activity传送的message对象和信使:
activityMessenger = msg.replyTo
创建Message对象:Message mess = Message.obtain()
activity端传送的信使将消息返回至activity端:activityMessenger.send(mess)
activity端onServiceConnected方法解析service端返回数据;
代码示例:
public class MainActivity extends Activity {
private TextView tv;
private Intent service;
private Messenger activityMessenger,serviceMessenger;
private ServiceConnection conn = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
}
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("tag", "MainActivity..ServiceConnection..onServiceConnected");
serviceMessenger = new Messenger(service);
}
};
private Handler handler = new Handler(new Handler.Callback() {
//接收返回的信息
@Override
public boolean handleMessage(Message msg) {
Log.i("tag", "MainActivity..handleMessage..接收的消息:"+msg.obj);
tv.setText("MainActivity接收的消息:"+msg.obj);
return false;
}
});
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.show);
activityMessenger = new Messenger(handler);
Log.i("tag", "MainActivity..onCreate");
}
public void click(View v){
switch (v.getId()) {
case R.id.binder://绑定
Log.i("tag", "MainActivity..bindService");
service = new Intent(this,MyService.class);
bindService(service, conn, BIND_AUTO_CREATE);
break;
case R.id.connection://通信
Log.i("tag", "MainActivity..通信");
Message mess = Message.obtain();
mess.obj = "来自MainActivity类的信息";
mess.what = 0;
mess.replyTo = activityMessenger;
try {
serviceMessenger.send(mess);//发送消息
} catch (RemoteException e) {e.printStackTrace();}
break;
default:
break;
}
}
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Service端:
public class MyService extends Service {
private Messenger serviceMessenger;
private Messenger activityMessenger;
//Handler对象实例化
private Handler handler = new Handler(new Handler.Callback() {
public boolean handleMessage(Message msg) {
Log.i("tag", "MyService..Handler..handleMessage");
if(msg.what == 0){
Log.i("tag", "MyService接受的消息"+msg.obj);
Message mess = Message.obtain();
mess.obj = "来自MyServic的消息";
activityMessenger = msg.replyTo;//获取信使
try {
activityMessenger.send(mess);//信使发送消息
} catch (RemoteException e) {e.printStackTrace();}
}
return false;
}
});
@Override
public IBinder onBind(Intent intent) {
Log.i("tag", "MyService..onBindd");
serviceMessenger = new Messenger(handler);
return serviceMessenger.getBinder();
}
}
注册清单注册服务:
<service android:name="com.example.androidday13_03.MyService"></service>