Tuesday, 29 May 2012

Hello guys, Most of you are aware of the Binding service. You can bind the service with your Activity, Service and Content provider. You can not bind a service with Broadcast receiver.

There are total 3 ways to bind a service with application components



  1. Using IBinder class
  2. Using Messanger class
  3. Using AIDL


This post is for explain about Messanger class

To implement Messanger class there are following steps 

Server side 


  1. The service implements a Handler that receives a callback for each call from a client.
  2. The Handler is used to create a Messenger object (which is a reference to the Handler).
  3. The Messenger creates an IBinder that the service returns to clients from onBind().
  4. The service receives each Message in its Handler—specifically, in the handleMessage() method.
Client side
  1. Create one activity "Client" and create a instance of the "ServiceConnection" Interface
  2. Implement two methods of this interface onServiceConnected and onServiceDisconnected
  3. In  onServiceConnected method you will get instance of the iBinder so create a Messanger object using that IBinder object
  4. Implement onStart() method and bind the service using bindService() method
  5. Implement onStop() method and unbind the service using unbindService() method
Example
Server.java





package com.example.bindservice.messanger;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

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;

public class Server extends Service{

 Messenger messenger = new Messenger(new LocalHandler());
 Messenger clientMessenger;
 static final int SysterTime = 0;
 static final int AddHandler = 1;
 List mHandlers;
 
 @Override
 public void onCreate() {
  super.onCreate();
  mHandlers = new ArrayList();
 }
 
 @Override
 public IBinder onBind(Intent intent) {
  return messenger.getBinder();
 }

 public class LocalHandler extends Handler {

  @Override
  public void handleMessage(Message msg) {
   switch (msg.what) {
   case SysterTime:
    SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
     clientMessenger.send(Message.obtain(null, SysterTime, mDateFormat.format(new Date())));
    } catch (RemoteException e) {
     e.printStackTrace();
    }
    break;

   case AddHandler:
    clientMessenger = new Messenger((Handler) msg.obj);
    try {
     clientMessenger.send(Message.obtain(null, AddHandler, "Registed messanger"));
    } catch (RemoteException e) {
     e.printStackTrace();
    }
    break;
    
   default:
    break;
   }
   super.handleMessage(msg);
  }
 }
}


Client.java




package com.example.bindservice.messanger;

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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class Client extends Activity {

 Messenger messenger;
 boolean mBounded;
 TextView text;
 Button button;
 Button register;
 
 
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        text = (TextView)findViewById(R.id.text);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
   
   public void onClick(View v) {
    
    Message message = Message.obtain(null, Server.SysterTime, null);
    try {
     messenger.send(message);
    } catch (RemoteException e) {
     e.printStackTrace();
    }
   }
  });
        
        register = (Button) findViewById(R.id.register);
        register.setOnClickListener(new OnClickListener() {
   
   public void onClick(View v) {
    
    Message message = Message.obtain(null, Server.AddHandler, new ClientHandle());
    try {
     messenger.send(message);
    } catch (RemoteException e) {
     e.printStackTrace();
    }
   }
  });
    }

 
 public class ClientHandle extends Handler {

  @Override
  public void handleMessage(Message msg) {

   switch (msg.what) {
   
   case Server.SysterTime:
    text.setText(msg.obj.toString());
    break;
   
   case Server.AddHandler:
    text.setText(msg.obj.toString());
    break;

   default:
    break;
   }
   
   super.handleMessage(msg);
  }
 }
 
 @Override
 protected void onStart() {
  super.onStart();
  bindService(new Intent(this, Server.class), mConnection, BIND_AUTO_CREATE);
 }

 @Override
 protected void onStop() {
  super.onStop();
  if(mBounded) {
   unbindService(mConnection);
  }
 }

 ServiceConnection mConnection = new ServiceConnection() {
  
  public void onServiceDisconnected(ComponentName name) {
   mBounded = false;
   messenger = null;
  }
  
  public void onServiceConnected(ComponentName name, IBinder service) {
   Toast.makeText(Client.this, "Service is connected", 1000).show();
   messenger = new Messenger(service);
   mBounded = true;
  }
 };
}

For more information you can refer the developer site.

No comments:

Post a Comment