Communicating between running activities

SDK Version: 

Starting a new activity from another and passing some data to it is a simple and basic thing in android. But if you want an already running activity to come to foreground, and pass data to it, it can be a bit tricky.

First of all by default if you call an activity with an intent, a new istance of that activity will be created and displayed, even if another instance is already running. To avoid this the activity must be flagged that, it should not be instantiated multiple times. To achieve this we will set the launchMode of the activity to singleTask in the AndroidManifest.xml

  1. <activity android:name="Activity1" android:launchMode="singleTask" android:label="@string/app_name">

This way when we call this activity using an intent, if there is an existing instance, the system will route the request to it. Hoever the onCreate method, where we usually process the passed extraData, will not run this time.

As its name shows it runs when the activity is created and this time it already exists, so the method called onNewIntent() will be called.

  1. protected void onNewIntent(Intent intent) {
  2.   super.onNewIntent(intent);
  3.   setIntent(intent);//must store the new intent unless getIntent() will return the old one
  4.   processExtraData();
  5. }

Do not forget that we can receive data in the normal way in onCreate, when the activity is first created, and since the system can easily kill activities in the backround, if this happens, the onCreate method will be called instead of onNewIntent.

So an elegant solution may call the same function to process extraData from intent from onCreate and onNewIntent.

  1. public void onCreate(Bundle savedInstanceState) {
  2.   super.onCreate(savedInstanceState);
  3.   setContentView(R.layout.main);
  4.   processExtraData();
  5. }
  7. protected void onNewIntent(Intent intent) {
  8.   super.onNewIntent(intent);
  9.   setIntent(intent);//must store the new intent unless getIntent() will return the old one
  10.   processExtraData()
  11. }
  13. private void processExtraData(){
  14.   Intent intent = getIntent();
  15.   //use the data received here
  16. }

A working example can be downloaded here.