page.title=Pausing and Resuming an Activity page.tags=activity lifecycle helpoutsWidget=true trainingnavtop=true @jd:body
During normal app use, the app sometimes loses focus, causing the activity to pause. For example, when apps run in multi-window mode, only one of the apps has the focus at any time; the system pauses all other apps. Similarly, when a semi-transparent activity opens (such as one in the style of a dialog), the previous activity pauses. As long as the activity is still partially visible but currently not the activity in focus, it remains paused.
However, once the activity is fully-obstructed and not visible, it stops (which is discussed in the next lesson).
As your activity enters the paused state, the system calls the {@link android.app.Activity#onPause onPause()} method on your {@link android.app.Activity}, which allows you to stop ongoing actions that should not continue while paused or persist any information that should be permanently saved in case the user continues to leave your app. If the user returns to your activity from the paused state, the system resumes it and calls the {@link android.app.Activity#onResume onResume()} method.
Note: When the system calls your activity's {@link android.app.Activity#onPause()} method, the system may be signaling that the activity will be paused for a moment and the user may return focus to your activity, or that the app is running in multi-window mode. However, this method call may also be the first indication that the user is leaving your activity.
When the system calls {@link android.app.Activity#onPause()} for your activity, it technically means your activity is still partially visible, but most often is an indication that the user is leaving the activity and it will soon enter the Stopped state. You should usually use the {@link android.app.Activity#onPause()} callback to:
For example, if your application uses the {@link android.hardware.Camera}, the {@link android.app.Activity#onPause()} method is a good place to release it.
@Override public void onPause() { super.onPause(); // Always call the superclass method first // Release the Camera because we don't need it when paused // and other activities might need to use it. if (mCamera != null) { mCamera.release(); mCamera = null; } }
Generally, you should not use {@link android.app.Activity#onPause()} to store user changes (such as personal information entered into a form) to permanent storage. The only time you should persist user changes to permanent storage within {@link android.app.Activity#onPause()} is when you're certain users expect the changes to be auto-saved (such as when drafting an email). However, you should avoid performing CPU-intensive work during {@link android.app.Activity#onPause()}, such as writing to a database, because it can slow the visible transition to the next activity (you should instead perform heavy-load shutdown operations during {@link android.app.Activity#onStop onStop()}).
You should keep the amount of operations done in the {@link android.app.Activity#onPause onPause()} method relatively simple in order to allow for a speedy transition to the user's next destination if your activity is actually being stopped.
Note: When your activity is paused, the {@link android.app.Activity} instance is kept resident in memory and is recalled when the activity resumes. You don’t need to re-initialize components that were created during any of the callback methods leading up to the Resumed state.
When the user resumes your activity from the Paused state, the system calls the {@link android.app.Activity#onResume()} method.
Be aware that the system calls this method every time your activity comes into the foreground, including when it's created for the first time. As such, you should implement {@link android.app.Activity#onResume()} to initialize components that you release during {@link android.app.Activity#onPause()} and perform any other initializations that must occur each time the activity enters the Resumed state (such as begin animations and initialize components only used while the activity has user focus).
The following example of {@link android.app.Activity#onResume()} is the counterpart to the {@link android.app.Activity#onPause()} example above, so it initializes the camera that's released when the activity pauses.
@Override public void onResume() { super.onResume(); // Always call the superclass method first // Get the Camera instance as the activity achieves full user focus if (mCamera == null) { initializeCamera(); // Local method to handle camera init } }