android的一些总结——service(二)之activity与service之间的通信

其实两者之间的通信应该用到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);

进行一些相应的操作,再返回信息

这样一个完整的通信就完成了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值