An Android app could contain one or many activities. An activity has its own lifecycle and we can launch a new activity by using intents. In order to send data from an activity to another we could use a Bundle.
Activity
Activity lifecycle
- onCreate() :
- When: it is called when an activity is first created
- What: all the necessary UI elements should be initialized
- Is activity visible: not yet
- onStart():
- When: an activity becomes visible to the user
- What: code that maintains the UI, start async tasks (get data from API or database), register listeners
- Is activity visible: yes
- onResume():
- When: is called before the user starts interacting with the activity
- What: start animations
- Is activity visible: yes
- onPause():
- When: user is leaving the activity
- What: stop animations
- Is activity visible: partially invisible
- onStop():
- When: the activity is no longer visible to the user
- What: unregister listeners and all resources allocated in onStart()
- Is activity visible: no
- onRestart():
- When: the activity in the stopped state is about to start again (on back click)
- What: the cursor should be requeried
- Is activity visible: no
- onDestroy():
- When: the activity is destroyed from the memory
- What: should never be overridden
- Is activity visible: no
To get data back from a launched activity, start that activity with the startActivityForResult() method instead of startActivity().
Let’s say we have 2 activities: Activity1 and Activity2 and we want to validate the message sent from Activity1 to Activity2 and just get the result after validation.
Steps to implement this behaviour:
- Activity1 => startActivityForResult() applied to an Intent with putExtra containing a String
- Activity2 => get the String from the bundle and validate data
- Activity2 => setResult() and finish current activity
- Activity1 => get the result from Activity2 by overriding onActivityResult()
The response codes are defined by the Activity
class, and can be
RESULT_OK
: The request was successful.RESULT_CANCELED
: The user canceled the operation.RESULT_FIRST_USER
: For defining your own result codes.
Official documentation:
Demo:
Code sample:
public class Activity1 extends AppCompatActivity { | |
public static final int REQUEST_CODE = 255; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_1); | |
} | |
public void sendMessageToActivityOnClick(View view) { | |
Intent intent = new Intent(Activity1.this, Activity2.class); | |
intent.putExtra(MESSAGE, "Are you there?"); | |
startActivityForResult(intent, REQUEST_CODE); | |
} | |
@Override | |
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { | |
super.onActivityResult(requestCode, resultCode, data); | |
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { | |
String resultFromActivity2 = data.getStringExtra(RESULT); | |
// use the result | |
} | |
} | |
} |
public class Activity2 extends AppCompatActivity { | |
public static final String RESULT = "result"; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_2); | |
Bundle bundle = getIntent().getExtras(); | |
if (bundle != null) { | |
String messageFromActivity = bundle.getString(MESSAGE); | |
if (messageFromActivity != null && messageFromActivity.length() >= 3) { | |
String response = "Yes, I'm here"; | |
Intent intent = new Intent(); | |
intent.putExtra(RESULT, response); | |
setResult(RESULT_OK, intent); | |
finish(); | |
} | |
} | |
} | |
} |
Intent
- An Intent is a messaging object you can use to request an action from another app component.
- Although intents facilitate communication between components in several ways.
Intent types
Explicit Intent
Starts a specific activity: an activity created by the developer
Intent launchSecondActivity = new Intent(AboutIntentsActivity.this, SecondActivity.class); | |
startActivity(launchSecondActivity); |
Implicit Intent
Asks system to find an activity that can handle the request: an activity created in the system (call, share, display a website, etc)
public static final String TAG = "ImplicitIntentsActivity"; | |
public void openUrlInBrowser(String url) { | |
// Parse the URI and create the intent | |
Uri website = Uri.parse(url); | |
Intent intent = new Intent(Intent.ACTION_VIEW, website); | |
// Find an activity to hand the intent and start that activity | |
if (intent.resolveActivity(getPackageManager()) != null) { | |
startActivity(intent); | |
} else { | |
Log.e(TAG, getResources().getString(R.string.can_not_handle_open_url)); | |
} | |
} | |
public void openLocationInMaps(String location) { | |
// Parse the location and create the intent. | |
Uri addressUri = Uri.parse("geo:0,0?q=" + location); | |
Intent intent = new Intent(Intent.ACTION_VIEW, addressUri); | |
// Find an activity to handle the intent, and start that activity. | |
if (intent.resolveActivity(getPackageManager()) != null) { | |
startActivity(intent); | |
} else { | |
Log.e(TAG, getResources().getString(R.string.can_not_handle_open_location)); | |
} | |
} |
Bundle
Used to transfer data using Intent.
// send data | |
String message = "just a text"; | |
Intent lunchReceiveTextActivity = new Intent(BundleSampleActivity.this, ReceiveTextActivity.class); | |
lunchReceiveTextActivity.putExtra(BundleSampleActivity.TEXT, message); | |
startActivity(lunchReceiveTextActivity); | |
// get data | |
Bundle bundle = getIntent().getExtras(); | |
if(bundle != null) { | |
String message = intent.getStringExtra(SendTextActivity.CAROL); | |
if (!message.isEmpty()) { | |
// use the received message | |
} | |
} |
Thanks for putting this article together with such a nice visual and code samples. I’m sure it helps many people understand those concepts better.
LikeLiked by 1 person