Android通信—信使的使用实现Activity与Service的通信

一、我们先来看一下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>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心灵行者

你的鼓励是我最大的创作动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值