How to register the receiver in the main activity?
Or you can do 2 things:
- Create and define
BroadcastReceiver
inManifest
- Build and register
BroadcastReceiver
in code.
For option 2 (which you ask):
Create BroadcastReceiver
in code (MyBroadcastReceiver). Declare MyBroadcastReceiver in your scope Activity
:
MyBroadcastReceiver mMyBroadcastReceiver;
Register BroadcastReceiver
in Activity
with:
IntentFilter filter = new IntentFilter(android.provider.Telephony.SMS_RECEIVED);
this.registerReceiver(mMyBroadcastReceiver, filter);
source to share
To receive SMS messages from the service, follow these steps:
- Update your manifest to give your app permissions to receive SMS messages. (WRITE_SMS, READ_SMS, RECEIVE_SMS)
- DO NOT update your manifest with the destination filter! (which every code example on the internet seems to do)
-
In your service, create a nested BroadcastReceiver class in the 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); } } } }
-
In your "Service" class, register to get a
android.provider.Telephony.SMS_RECEIVED
filter goal: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); } }
What is it!
Note:
you're not interested in why I didn't bind to my service from a separate BroadcastReceiver class - it doesn't work because it is bindService()
not available.
source to share
As you asked to register BroadcastReceiver
inside yours MainActivity
, which is suitable forregisterReceiver-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();
}
};
}
source to share