4

I have a SmsReceiver class that I want to register in the main activity, what exactly should I do ?

I am new to Android.

Marwan Tushyeh
  • 1,475
  • 4
  • 24
  • 45
  • You can take a look at this post http://stackoverflow.com/questions/4660823/android-alarm-not-working/4661122#4661122 – ccheneson Jan 18 '13 at 10:53
  • There is plenty of answers on this topic. Check [this](http://stackoverflow.com/a/4805733/1521064), [this](http://stackoverflow.com/questions/4134203/how-to-use-registerreceiver-method) and [this](http://stackoverflow.com/questions/6508300/how-to-register-broadcast-receiver). – vault Jan 18 '13 at 11:00
  • possible duplicate of [Programmatically register a broadcast receiver](http://stackoverflow.com/questions/4805269/programmatically-register-a-broadcast-receiver) – glomad Jan 18 '13 at 15:22

5 Answers5

5

Either you can do 2 things:

  1. Create and define BroadcastReceiver in the Manifest
  2. Create and register the BroadcastReceiver in code.

For option 2 (which you are asking):

Create a BroadcastReceiver in code (MyBroadcastReceiver). Declare MyBroadcastReceiver in the scope of your Activity:

MyBroadcastReceiver mMyBroadcastReceiver;

Register the BroadcastReceiver in your Activity by:

IntentFilter filter = new IntentFilter(android.provider.Telephony.SMS_RECEIVED);
this.registerReceiver(mMyBroadcastReceiver, filter);
RvdK
  • 19,128
  • 3
  • 59
  • 105
2

To have a Service receive SMS messages follow next steps:

  1. Update the manifest to give your app the permissions to receive SMS (WRITE_SMS, READ_SMS, RECEIVE_SMS)
  2. DO NOT update the manifest with the receiver intent filter ! (which every sample code online seems to do)
  3. In your Service, create a nested BroadcastReceiver class within your Service class

    private class SMSreceiver extends BroadcastReceiver
    {
        private final String TAG = this.getClass().getSimpleName();
    
        @Override
        public void onReceive(Context context, Intent intent)
        {
            Bundle extras = intent.getExtras();
    
            String strMessage = "";
    
            if ( extras != null )
            {
                Object[] smsextras = (Object[]) extras.get( "pdus" );
    
                for ( int i = 0; i < smsextras.length; i++ )
                {
                    SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]);
    
                    String strMsgBody = smsmsg.getMessageBody().toString();
                    String strMsgSrc = smsmsg.getOriginatingAddress();
    
                    strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;                    
    
                    Log.i(TAG, strMessage);
                }
    
            }
    
        }
    
    }
    
  4. In your Service class, register to receive the android.provider.Telephony.SMS_RECEIVED intent filter :

    public class ServiceCommunicator extends Service
    {
        private SMSreceiver mSMSreceiver;
        private IntentFilter mIntentFilter;
    
        @Override
        public void onCreate()
        {
            super.onCreate();
    
            //SMS event receiver
            mSMSreceiver = new SMSreceiver();
            mIntentFilter = new IntentFilter();
            mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
            registerReceiver(mSMSreceiver, mIntentFilter);
        }
    
        @Override
        public void onDestroy()
        {
            super.onDestroy();
    
            // Unregister the SMS receiver
            unregisterReceiver(mSMSreceiver);
        }
    }
    

That's it !

note: encase you're wondering why I didn't bind to my service from within a separate BroadcastReceiver class - it doesn't work because bindService() isn't available.

jlopez
  • 6,287
  • 2
  • 51
  • 90
1

For API level 19 and above

 IntentFilter smsFilter = new IntentFilter();
 smsFilter.addAction(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
registerReceiver(this.receiver, filter);
Zohra Khan
  • 5,024
  • 4
  • 24
  • 34
0

As you've asked to register BroadcastReceiver inside your MainActivity that fits to registerReceiver-codewise-inside-MainActivity

Here's what code looks like ==>

public class MainActivity extends Activity 
{
BroadcastReceiver smsReceiver;
private IntentFilter myFilter = new IntentFilter(android.provider.Telephony.SMS_RECEIVED);

   protected void onCreate(Bundle savedInstanceState) 
   {
    super.onCreate(savedInstanceState);
    registerReceiver(smsReceiver, myFilter); // register BroadCastReceiver at time of initialization of Activity with proper Intent-Filter
   }

@Override
  protected void onPause() 
   {
    unregisterReceiver(smsReceiver); // UnRegister BroadCastReceiver as you no longer have your activity at Foreground -- Saving CPU & Battery Drainage
    super.onPause();
   }

 @Override
   protected void onResume() 
   {
    registerReceiver(smsReceiver, myFilter); // Register BroadCastReceiver Once again as your activity comes from pause to forground state again.
    super.onResume();
   }

  smsReceiver = new BroadcastReceiver() //Implementation of your BroadCastReceiver
  {

    @Override
    public void onReceive(Context context, Intent intent)
    {
       // Do whatever you like as sms is received and caught by these BroadCastReceiver
        Toast.makeText(context, "SMS Received", Toast.LENGTH_LONG).show();          
    }
  };
 }
Vikalp Patel
  • 10,420
  • 6
  • 58
  • 94
0
private BroadcastReceiver receiver = new BroadcastReceiver() {

   @Override
   public void onReceive(Context context, Intent intent) {
       //some action
   }
};

IntentFilter filter = new IntentFilter("YOUR_ACTION");
registerReceiver(receiver, filter);

Hope this helps

Sanoop Surendran
  • 3,361
  • 4
  • 26
  • 49
Priyanka
  • 361
  • 1
  • 6
  • 8