其实两者之间的通信应该用到bindService启动service这样通信才有意义
activity和service通信要通过Messenger(信使)来进行管理,下面我们来看看activity和service要添加的代码,然后再详细解释
activity中添加的代码如下:
//接收service的 Messenger
private Messenger serviceMessenger = null;
//activity本身 的 Messenger
private Messenger myMessenger =null ;
//添加标识由此判断activity接收到service返回的,执行相应的操作
public static final int service_back = 1;
//Handler
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what){
case service_back:
//当service 完成自己的事情后 通知activity 显示 toast
Toast.makeText(getApplicationContext(), "service back ==!", Toast.LENGTH_SHORT).show();
break;
}
};
};
public void doSomethings() {
myMessenger = new Messenger(handler);
// 创建并发送一个消息给service
Message msg = Message.obtain(null, MyService.Hello_Service, 0, 0);
//指明此message发送到何处的可选Messenger对象。具体的使用方法由发送者和接受者决定。
msg.replyTo = myMessenger;
try {
//将包含本身 Messenger 的 message发送出去
serviceMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
// serviceMessenger = new Messenger(service);
MyBinder binder = (MyBinder)service;
MyService bindService = binder.getService();
serviceMessenger = bindService.MyMethod();
flag = true;
doSomethings();
}
};
service中添加的代码:
//添加标识由此判断service接收到activity发送的什么指令,执行相应的操作
public static final int Hello_Service = 1;
// Handler处理
private Handler handler =new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case Hello_Service:
//显示toast
Toast.makeText(getApplicationContext(), " Hello_Service_in_handler! ", Toast.LENGTH_SHORT).show();
//得到msg 就可以用 得到的 messenger 给客户端发送数据了
replyMessenger = msg.replyTo;
//执行相应的操作
th.start();
break;
default:
super.handleMessage(msg);
}
}
};
//使用 信息给客户端发送消息 发送消息的的对象
private final Messenger serviceMessenger = new Messenger(handler);
// 得到的客户端传递过来的 Messenger(信使)
private Messenger replyMessenger ;
//做了1个假的执行操作的线程
private Thread th = new Thread(){
public void run() {
try {
Thread.sleep(3000);
//假设上面执行了自己操作3秒
//现在给客户端回应
Message msg = Message.obtain(null, MainActivity.service_back, 0,0);
replyMessenger.send(msg);
} catch (RemoteException e) {
} catch (InterruptedException e) {
}
};
};
public Messenger MyMethod(){
Log.i("TAG", "BindService-->MyMethod()");
return serviceMessenger;
}
service和activity各有两个信使,一个是自己的信使new Messenger(handler),用来接收对方发来的消息,然后在handler中进行相应的处理第二个是对方的信使用来发送消息,这样就形成了通信
上面的例子通信是activity中发起的,看看是怎么得到对方信使的
serviceMessenger = bindService.MyMethod();
通过这句话,通过bind返回回来的
public void doSomethings() {
myMessenger = new Messenger(handler);
// 创建并发送一个消息给service
Message msg = Message.obtain(null, MyService.Hello_Service, 0, 0);
//指明此message发送到何处的可选Messenger对象。具体的使用方法由发送者和接受者决定。
msg.replyTo = myMessenger;
try {
//将包含本身 Messenger 的 message发送出去
serviceMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
这个方法是像service中发送数据,并通过msg.replyTo = myMessenger; 设置返回通信时自己用那个信使接收serviceMessenger.send(msg); 把信息发送给service的serviceMessenger(信使)
replyMessenger = msg.replyTo;
//执行相应的操作
th.start();
得到activity的信使然后再执行线程操作
线程里面
Message msg = Message.obtain(null, MainActivity.service_back, 0,0);
replyMessenger.send(msg);
进行一些相应的操作,再返回信息
这样一个完整的通信就完成了