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(); } }