Broadcast Receiver within a Service Broadcast Receiver within a Service android android

Broadcast Receiver within a Service


as your service is already setup, simply add a broadcast receiver in your service:

private final BroadcastReceiver receiver = new BroadcastReceiver() {   @Override   public void onReceive(Context context, Intent intent) {      String action = intent.getAction();      if(action.equals("android.provider.Telephony.SMS_RECEIVED")){        //action for sms received      }      else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){           //action for phone state changed      }        }};

in your service's onCreate do this:

IntentFilter filter = new IntentFilter();filter.addAction("android.provider.Telephony.SMS_RECEIVED");filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);filter.addAction("your_action_strings"); //further morefilter.addAction("your_action_strings"); //further moreregisterReceiver(receiver, filter);

and in your service's onDestroy:

unregisterReceiver(receiver);

and you are good to go to receive broadcast for what ever filters you mention in onCreate. Make sure to add any permission if required. for e.g.

<uses-permission android:name="android.permission.RECEIVE_SMS" />


The better pattern is to create a standalone BroadcastReceiver. This insures that your app can respond to the broadcast, whether or not the Service is running. In fact, using this pattern may remove the need for a constant-running Service altogether.

Register the BroadcastReceiver in your Manifest, and create a separate class/file for it.

Eg:

<receiver android:name=".FooReceiver" >    <intent-filter >        <action android:name="android.provider.Telephony.SMS_RECEIVED" />    </intent-filter></receiver>

When the receiver runs, you simply pass an Intent (Bundle) to the Service, and respond to it in onStartCommand().

Eg:

public class FooReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        // do your work quickly!        // then call context.startService();    }   }