Android service: Messenger 进程通信

 

  • package com.xwangly.apidemo.app;  
  •   
  • import java.util.Random;  
  •   
  • import android.app.Service;  
  • import android.content.Intent;  
  • import android.os.Handler;  
  • import android.os.IBinder;  
  • import android.os.Message;  
  • import android.os.Messenger;  
  • import android.os.RemoteException;  
  • import android.util.Log;  
  •   
  • public class MessengerService extends Service {  
  •     private String TAG = "MessengerService";  
  •   
  •     @Override  
  •     public void onDestroy() {  
  •         // TODO Auto-generated method stub  
  •         Log.i(TAG, "onDestroy");  
  •         cMessenger = null;  
  •         super.onDestroy();  
  •     }  
  •   
  •     @Override  
  •     public boolean onUnbind(Intent intent) {  
  •         // TODO Auto-generated method stub  
  •         Log.i(TAG, "onUnbind");  
  •         return super.onUnbind(intent);  
  •     }  
  •   
  •     static final int MSG_REGISTER_CLIENT = 1;  
  •     static final int MSG_UNREGISTER_CLIENT = 2;  
  •     static final int MSG_SET_VALUE = 3;  
  •   
  •     private Random random = new Random();  
  •   
  •     private Handler mHandler = new Handler() {  
  •   
  •         @Override  
  •         public void handleMessage(Message msg) {  
  •             // TODO Auto-generated method stub  
  •             Log.i(TAG, "handleMessage");  
  •             switch (msg.what) {  
  •             case MSG_SET_VALUE:  
  •                 try {  
  •                     Message message = Message.obtain(null,  
  •                             MessengerService.MSG_SET_VALUE);  
  •                     message.arg1 = random.nextInt(100);  
  •                      
  •                     //得到客户端的信使对象,并向它发送消息  
  •                     cMessenger = msg.replyTo;  
  •                     cMessenger.send(message);  
  •                 } catch (RemoteException e) {  
  •                     // TODO Auto-generated catch block  
  •                     e.printStackTrace();  
  •                 }  
  •                 break;  
  •             default:  
  •                 super.handleMessage(msg);  
  •             }  
  •   
  •         }  
  •     };  
  •   
  •     /**
  •      * 自己的信使对象
  •      */  
  •     private Messenger mMessenger = new Messenger(mHandler);  
  •   
  •     /**
  •      * 客户的信使
  •      */  
  •     private Messenger cMessenger;  
  •   
  •     @Override  
  •     public IBinder onBind(Intent intent) {  
  •         // TODO Auto-generated method stub  
  •         Log.i(TAG, "onBind");  
  •         //返回自己信使的bindler,以供客户端通过这个bindler得到服务端的信使对象(通过new Messenger(bindler))  
  •         return mMessenger.getBinder();  
  •     }  
  •   
  •     @Override  
  •     public void onRebind(Intent intent) {  
  •         // TODO Auto-generated method stub  
  •         Log.i(TAG, "onRebind");  
  •   
  •     }  
  •   
  • }  

 

MessengerServiceActivities.java

Java代码  

    • package com.xwangly.apidemo.app;  
    •   
    • import com.xwangly.apidemo.R;  
    •   
    • import android.app.Activity;  
    • import android.content.ComponentName;  
    • import android.content.Intent;  
    • import android.content.ServiceConnection;  
    • import android.os.Bundle;  
    • import android.os.Handler;  
    • import android.os.IBinder;  
    • import android.os.Message;  
    • import android.os.Messenger;  
    • import android.os.RemoteException;  
    • import android.util.Log;  
    • import android.view.View;  
    • import android.widget.TextView;  
    •   
    • public class MessengerServiceActivities {  
    •     public static class Binding extends Activity implements  
    •             View.OnClickListener {  
    •         private String TAG = "Binding";  
    •   
    •         TextView mCallbackText;  
    •   
    •         private boolean isBound;  
    •   
    •         @Override  
    •         protected void onCreate(Bundle savedInstanceState) {  
    •             // TODO Auto-generated method stub  
    •             super.onCreate(savedInstanceState);  
    •             setContentView(R.layout.messenger_service_binding);  
    •             findViewById(R.id.bind).setOnClickListener(this);  
    •             findViewById(R.id.unbind).setOnClickListener(this);  
    •   
    •             mCallbackText = (TextView) findViewById(R.id.callback);  
    •             mCallbackText.setText("Not attached.");  
    •   
    •         }  
    •   
    •         private Handler mHandler = new Handler() {  
    •             @Override  
    •             public void handleMessage(Message msg) {  
    •                 Log.i(TAG, "handleMessage");  
    •                 switch (msg.what) {  
    •                 case MessengerService.MSG_SET_VALUE:  
    •                     mCallbackText.setText("Received from service: " + msg.arg1);  
    •                     break;  
    •                 default:  
    •                     super.handleMessage(msg);  
    •                 }  
    •             }  
    •         };  
    •   
    •         /**
    •          * 自己的信使
    •          */  
    •         private Messenger mMessenger;  
    •          
    •         /**
    •          * 远程服务的信使
    •          */  
    •         private Messenger rMessenger;  
    •          
    •         private ServiceConnection connection = new ServiceConnection() {  
    •   
    •             public void onServiceConnected(ComponentName name, IBinder service) {  
    •                 // TODO Auto-generated method stub  
    •                 Log.i(TAG, "onServiceConnected");  
    •                 rMessenger = new Messenger(service);  
    •                 mMessenger = new Messenger(mHandler);  
    •                   
    •                 sendMessage();  
    •             }  
    •   
    •   
    •             public void onServiceDisconnected(ComponentName name) {  
    •                 // TODO Auto-generated method stub  
    •                 rMessenger = null;  
    •             }  
    •         };  
    •   
    •         public void onClick(View v) {  
    •             // TODO Auto-generated method stub  
    •             Intent intent = new Intent(  
    •                     "com.xwangly.apidemo.app.messenger_service");  
    •             switch (v.getId()) {  
    •             case R.id.bind:  
    •                 if (!isBound) {  
    •                     isBound = bindService(intent, connection, BIND_AUTO_CREATE);  
    •                     //isBound = true;  
    •                 }else {  
    •                     sendMessage();  
    •                 }  
    •                 break;  
    •             case R.id.unbind:  
    •                 if (isBound) {  
    •                     unbindService(connection);  
    •                     isBound = false;  
    •                 }  
    •                 break;  
    •             default:  
    •                 break;  
    •             }  
    •         }  
    •          
    •         /**
    •          * 使用服务端的信使向它发送一个消息。
    •          */  
    •         private void sendMessage() {  
    •             // TODO Auto-generated method stub  
    •             Message message = Message.obtain(null, MessengerService.MSG_SET_VALUE);  
    •             message.replyTo = mMessenger;  
    •             try {  
    •                 rMessenger.send(message);  
    •             } catch (RemoteException e) {  
    •                 // TODO Auto-generated catch block  
    •                 e.printStackTrace();  
    •             }  
    •         }  
    •   
    •     }  
    •   

转载于:https://www.cnblogs.com/cdiamond/archive/2012/11/02/2751022.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值