進程通訊(IPC)之Messenger

bound服務是客戶端-服務器模式的服務。html

bound服務的建立方式之一:android

建立一個支持綁定的服務時,你必須提供一個 IBinder,用做客戶端和服務間進行通訊的編程接口web

使用Messenger定義該接口:編程

若是你須要接口跨越多個進程進行工做,能夠經過Messenger來爲服務建立接口。在這種方式下,服務定義一個響應各種消息對象MessageHandler。此HandlerMessenger與客戶端共享同一個IBinder的基礎,它使得客戶端能夠用消息對象Message向服務發送指令。此外,客戶端還能夠定義本身的Message,以便服務可以往回發送消息。服務器

 

簡單的說,就是服務和客戶端都要有本身的Messenger,而後經過handler處理各自Messenger發送的message消息。(客戶端和服務相互響應的原理)。多線程

 

 

 

 

public class MessageService  extends Service{
 //本例的Service在聲明時必須對外開放,即android:exported="true"。
 //Messenger通訊是不支持多線程的,要用到多線程就該換成AIDL通訊
 public static final int WHAT_1=1;
 Messenger client_messenger;
 
    @Override
    public void onCreate() {
     super.onCreate();
    }
   
 public IBinder onBind(Intent intent) {
  
  return messenger.getBinder();
 }
 public void onDestroy() {
  
  super.onDestroy();
 }
 
 //經過handler建立一個messenger,Messenger實質是對handler的引用
 final Messenger messenger=new Messenger(new MessageHandler());
 
 //定義一個handler子類。用於接受message對象
 class MessageHandler extends Handler{
  @Override
  public void handleMessage(Message msg) {
   
   switch (msg.what) {
    case WHAT_1:
     
     client_messenger=msg.replyTo;//接受到傳遞過來的,客戶端的Messsenger. 經過該Messenger發送消息到客戶端
     
     break;
 
    default:
     super.handleMessage(msg);
   }
 
  }
 }
 
 
 //發送客戶端要處理的message
 public void sendClientMessage(){
   Message message=Message.obtain(null, MessageActivity.CLIENT_WAHT, null);
   try {
    client_messenger.send(message);
   } catch (RemoteException e) {
    e.printStackTrace();
   }
  }
  
ide

}this

 

 

 

 

public class MessageActivity extends Activity {
 //Service的Messenger對象
 Messenger service_messenger=null;
 
 //客戶端的Messenger對象
 Messenger client_messenger=new Messenger(new ClientHandler());
 
 boolean isBound;
 Message message;
 final static int CLIENT_WAHT=2;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }
 
 //綁定和解綁Service都是按需求而定的,說白了,哪裏要用,就在那裏綁定(或者解綁)。
 protected void onStart() {
  Intent intent=new Intent(this,MessageService.class);
  bindService(intent, connection, Context.BIND_AUTO_CREATE);//經過綁定方式開啓服務
  super.onStart();
 }
 protected void onStop() {
  //解除綁定
  if(isBound){
   unbindService(connection);
  }
  super.onStop();
 }
 
 
 public void sendServiceMessage(){
  if(isBound){
   return ;
  }
  String content="Messenger方式解決當前service要被其餘運用程序調用或者要跨多個進程間的通訊";
  message=Message.obtain(null,  MessageService.WHAT_1  ,null);
  message.obj=content;
  message.replyTo=client_messenger; //將客戶端的Messenger傳遞到Service中。不須要Service響應,則不須要寫這行代碼
  //在Service裏將經過客戶端的Messenger發送消息到對應的客戶端,而後進行處理( Service 響應客戶端的原理 )
  try {
   service_messenger.send(message);
  } catch (RemoteException e) {
   e.printStackTrace();
  }
 }
 
 
 ServiceConnection  connection=new ServiceConnection() {
  //與服務鏈接發生中斷時(好比service崩潰或者被系統殺死)會被調用
  //注意點:activity解除綁定不會調用
  public void onServiceDisconnected(ComponentName arg0) {
   isBound=false;
   service_messenger=null;
  }
  //當與service綁定時會調用。  經過Messenger與Service進行通訊
  public void onServiceConnected(ComponentName className, IBinder ibinder) {
   isBound=true;
   service_messenger=new Messenger(ibinder); //獲取到Service中的Messenger對象
   
  }
 };
 
 
 
 //用於處理Service傳遞的信息
 class ClientHandler extends Handler{
  public void handleMessage(Message msg) {
   switch (msg.what) {
    case CLIENT_WAHT:
     //需求而定,執行操做
     break;
 
    default:
     super.handleMessage(msg);
   }
   
 
  }
 }
 spa


}
線程

相關文章
相關標籤/搜索