title: Android how to call a method of MainActivity in SmsReceiver Class
body: <p>I'm very new to Android Programming, It would be really great if someone can help me in this.My project contains two JAVA files.</p>
  
  <blockquote>
    <p>MainActivity.java extends Activity<br>
    SMSReceiver.java extends Broadcastreceiver  </p>
  </blockquote>
  
  <p>The SMSreceiver.java has the code which displays any incoming <code>SMS</code> in toast. Can you please tell me how to call a function in <code>MainActivity</code> whenever a particular SMS is received. For eg: when I receive sms called as starttemp it should call a function starttemp.  </p>
  
  <p>I have searched a lot and found that intents are a way to do this and we cannot call these methods directly. Please can anyone help me in this? And it would be really great if someone can send me working code.</p>
  
  <p><strong>This would be my MainACtivity.Java</strong>  </p>
  
  <pre><code>package com.wissen.sms;
  
  import android.annotation.SuppressLint;
  import android.app.Activity;
  import android.bluetooth.BluetoothAdapter;
  import android.bluetooth.BluetoothDevice;
  import android.bluetooth.BluetoothSocket;
  import android.content.Intent;
  import android.os.Bundle;
  import android.os.Handler;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.TextView;
  import android.widget.EditText;  
  import android.widget.Button;
  import android.widget.ToggleButton;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.util.Set;
  import java.util.UUID;
  
  @SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi" }) public class MainActivity extends Activity 
  {
      TextView myLabel;
      EditText myTextbox;
      ToggleButton switch1;
  
  
      BluetoothAdapter mBluetoothAdapter;
      BluetoothSocket mmSocket;
      BluetoothDevice mmDevice;
      OutputStream mmOutputStream;
      InputStream mmInputStream;
      Thread workerThread;
      byte[] readBuffer;
      int readBufferPosition;
      int counter;
      String status;
      volatile boolean stopWorker;
  
      @Override
      public void onCreate(Bundle savedInstanceState)
      {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
  
          Button openButton = (Button)findViewById(R.id.open);
          Button sendButton = (Button)findViewById(R.id.send);
          Button closeButton = (Button)findViewById(R.id.close);
          myLabel = (TextView)findViewById(R.id.label);
          myTextbox = (EditText)findViewById(R.id.entry);
  
  
  
  
        //switch1
          switch1 = (ToggleButton) findViewById(R.id.switch1);
          switch1.setOnClickListener(new OnClickListener()
              {
              public void onClick(View v)
              {
                  if(switch1.isChecked()){
                      try 
                  {
                      String msg = "01ON";
                      msg += "\n\r";
                      mmOutputStream.write(msg.getBytes());
                      myLabel.setText("Data Sent");
                  }
                  catch (IOException ex) { }
  
                  }else{
                      try 
                  {
                      String msg = "01OF";
                      msg += "\n\r";
                      mmOutputStream.write(msg.getBytes());
                      myLabel.setText("Data Sent");
  
                  }
                  catch (IOException ex) { }
                  }
               }
  
               });
  
  
          //Open Button
          openButton.setOnClickListener(new View.OnClickListener()
          {
              public void onClick(View v)
              {
                  try 
                  {
                      findBT();
                      openBT();
                  }
                  catch (IOException ex) { }
              }
          });
  
          //Send Button
          sendButton.setOnClickListener(new View.OnClickListener()
          {
              public void onClick(View v)
              {
                  try 
                  {
                      sendData();
                  }
                  catch (IOException ex) { }
              }
          });
  
          //Close button
          closeButton.setOnClickListener(new View.OnClickListener()
          {
              public void onClick(View v)
              {
                  try 
                  {
                      closeBT();
                  }
                  catch (IOException ex) { }
              }
          });
  
  
      }
  
      void findBT()
      {
          mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
          if(mBluetoothAdapter == null)
          {
              myLabel.setText("No bluetooth adapter available");
          }
  
          if(!mBluetoothAdapter.isEnabled())
          {
              Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
              startActivityForResult(enableBluetooth, 0);
          }
  
          Set&lt;BluetoothDevice&gt; pairedDevices = mBluetoothAdapter.getBondedDevices();
          if(pairedDevices.size() &gt; 0)
          {
              for(BluetoothDevice device : pairedDevices)
              {
                  if(device.getName().equals("HomeAutomation")) 
                  {
                      mmDevice = device;
                      break;
                  }
              }
          }
          myLabel.setText("Bluetooth Device Found");
      }
  
      void openBT() throws IOException
      {
          UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard SerialPortService ID
          mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);        
          mmSocket.connect();
          mmOutputStream = mmSocket.getOutputStream();
          mmInputStream = mmSocket.getInputStream();
  
          beginListenForData();
  
          myLabel.setText("Bluetooth Opened");
      }
  
      void beginListenForData()
      {   
          final Handler handler = new Handler(); 
          final byte delimiter = 10; //This is the ASCII code for a newline character
  
          stopWorker = false;
          readBufferPosition = 0;
          readBuffer = new byte[1024];
          workerThread = new Thread(new Runnable()
          {
              public void run()
              {               
                 while(!Thread.currentThread().isInterrupted() &amp;&amp; !stopWorker)
                 {
                      try 
                      {
  
  
                          int bytesAvailable = mmInputStream.available();                        
                          if(bytesAvailable &gt; 0)
                          {
                              byte[] packetBytes = new byte[bytesAvailable];
                              mmInputStream.read(packetBytes);
                              for(int i=0;i&lt;bytesAvailable;i++)
                              {
                                  byte b = packetBytes[i];
                                  if(b == delimiter)
                                  {
                                      byte[] encodedBytes = new byte[readBufferPosition];
                                      System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
                                      final String data = new String(encodedBytes, "US-ASCII");
                                      readBufferPosition = 0;
  
                                      handler.post(new Runnable()
                                      {
                                          public void run()
                                          {   
                                              status=data;
                                              myLabel.setText(data);
                                          }
                                      });
                                  }
                                  else
                                  {
                                      readBuffer[readBufferPosition++] = b;
                                  }
                              }
                          }
                      } 
                      catch (IOException ex) 
                      {
                          stopWorker = true;
                      }
                 }
              }
          });
  
          workerThread.start();
      }
  
  
      void sendData() throws IOException
      {
          String msg = myTextbox.getText().toString();
          msg += "\n\r";
          mmOutputStream.write(msg.getBytes());
          myLabel.setText("Data Sent");
      }
  
      void closeBT() throws IOException
      {
          stopWorker = true;
          mmOutputStream.close();
          mmInputStream.close();
          mmSocket.close();
          myLabel.setText("Bluetooth Closed");
      }
  }
  </code></pre>
  
  <p><strong>This would be My SMSReceiver.Java</strong>  </p>
  
  <pre><code>package com.wissen.sms.receiver;
  
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.os.Bundle;
  import android.telephony.gsm.SmsMessage;
  import android.widget.Toast;
  
  
  public class SMSReceiver extends BroadcastReceiver {
  
      @Override
      public void onReceive(Context context, Intent intent) {
          Bundle bundle = intent.getExtras();
  
          Object messages[] = (Object[]) bundle.get("pdus");
          SmsMessage smsMessage[] = new SmsMessage[messages.length];
          for (int n = 0; n &lt; messages.length; n++) {
              smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
          }
  
          Toast toast = Toast.makeText(context, "Received SMS: " + smsMessage[0].getMessageBody(), Toast.LENGTH_LONG);
          toast.show();
      }
  }
  </code></pre>
  
  <p>Now i want to call a method of MainActivity.java whenever a new message is received</p>
  
  <pre><code>void somemethod()
  {
  
  try 
  {
              String msg = "01ON";
                  msg += "\n\r";
                  mmOutputStream.write(msg.getBytes());
                  myLabel.setText("Data Sent");
  }
  catch (IOException ex) { }
  
  
  
  }
  }
  </code></pre>