To communicate between activity ad services there two major ways
1. Broadcast receiver
2. Aidl – Android Interface Definition Language
3. Messenger
In this post, we will just go through Broadcast receivers,
1. Create a service and activity.
2. Create a broadcast receiver for both service and activity.
3. Register the receiver in the activity and service.
Scenario:
1. Service starts on launching the application.
2. Onclick of a button, activity sends broadcast to service
3. service in turn sends broadcast to the activity.
SERVICE
public class MyService extends Service {
//Strings to register to create intent filter for registering the recivers
private static final String ACTION_STRING_SERVICE = "ToService";
private static final String ACTION_STRING_ACTIVITY = "ToActivity";
//STEP1: Create a broadcast receiver
private BroadcastReceiver serviceReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(getApplicationContext(), "received message in service..!", Toast.LENGTH_SHORT).show();
Log.d("Service", "Sending broadcast to activity");
sendBroadcast();
}
};
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("Service", "onCreate");
//STEP2: register the receiver
if (serviceReceiver != null) {
//Create an intent filter to listen to the broadcast sent with the action "ACTION_STRING_SERVICE"
IntentFilter intentFilter = new IntentFilter(ACTION_STRING_SERVICE);
//Map the intent filter to the receiver
registerReceiver(serviceReceiver, intentFilter);
}
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("Service", "onDestroy");
//STEP3: Unregister the receiver
unregisterReceiver(serviceReceiver);
}
//send broadcast from activity to all receivers listening to the action "ACTION_STRING_ACTIVITY"
private void sendBroadcast() {
Intent new_intent = new Intent();
new_intent.setAction(ACTION_STRING_ACTIVITY);
sendBroadcast(new_intent);
}
}
ACTIVITY
public class sample extends Activity {
//Strings to register to create intent filter for registering the recivers
private static final String ACTION_STRING_SERVICE = "ToService";
private static final String ACTION_STRING_ACTIVITY = "ToActivity";
//STEP1: Create a broadcast receiver
private BroadcastReceiver activityReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(getApplicationContext(), "received message in activity..!", Toast.LENGTH_SHORT).show();
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//STEP2: register the receiver
if (activityReceiver != null) {
//Create an intent filter to listen to the broadcast sent with the action "ACTION_STRING_ACTIVITY"
IntentFilter intentFilter = new IntentFilter(ACTION_STRING_ACTIVITY);
//Map the intent filter to the receiver
registerReceiver(activityReceiver, intentFilter);
}
//Start the service on launching the application
startService(new Intent(this,MyService.class));
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("SampleActivity", "Sending broadcast to service");
sendBroadcast();
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("Service", "onDestroy");
//STEP3: Unregister the receiver
unregisterReceiver(activityReceiver);
}
//send broadcast from activity to all receivers listening to the action "ACTION_STRING_SERVICE"
private void sendBroadcast() {
Intent new_intent = new Intent();
new_intent.setAction(ACTION_STRING_SERVICE);
sendBroadcast(new_intent);
}
}
Conclusion:
This seemed a simple solution but this was a chaotic one. So had to move into second approach.