Also setting up redirects, and making necessary changes to other docs (e.g. drag-and-drop) to account for new feature. Added "see also" links to a few appropriate pages. See first comment for doc stage location. Change-Id: I2a57767a12cf944713c52cddc8422414ce595b2c
162 lines
6.6 KiB
Plaintext
162 lines
6.6 KiB
Plaintext
page.title=Pausing and Resuming an Activity
|
||
page.tags=activity lifecycle
|
||
helpoutsWidget=true
|
||
|
||
trainingnavtop=true
|
||
|
||
@jd:body
|
||
|
||
<div id="tb-wrapper">
|
||
<div id="tb">
|
||
|
||
<h2>This lesson teaches you to</h2>
|
||
<ol>
|
||
<li><a href="#Pause">Pause Your Activity</a></li>
|
||
<li><a href="#Resume">Resume Your Activity</a></li>
|
||
</ol>
|
||
|
||
<h2>You should also read</h2>
|
||
<ul>
|
||
<li><a href="{@docRoot}guide/components/activities.html">Activities</a>
|
||
</li>
|
||
</ul>
|
||
|
||
<h2>Try it out</h2>
|
||
|
||
<div class="download-box">
|
||
<a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip"
|
||
class="button">Download the demo</a>
|
||
<p class="filename">ActivityLifecycle.zip</p>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<p>
|
||
During normal app use, the app sometimes loses focus, causing the activity to
|
||
<em>pause</em>. For example, when apps run in <a href=
|
||
"{@docRoot}guide/topics/ui/multi-window.html">multi-window mode</a>, 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.
|
||
</p>
|
||
|
||
<p>However, once the activity is fully-obstructed and not visible, it <em>stops</em> (which is
|
||
discussed in the next lesson).</p>
|
||
|
||
<p>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.</p>
|
||
|
||
<p class="note">
|
||
<strong>Note:</strong> 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.
|
||
</p>
|
||
|
||
<img src="{@docRoot}images/training/basics/basic-lifecycle-paused.png" />
|
||
<p class="img-caption"><strong>Figure 1.</strong> When a semi-transparent activity obscures
|
||
your activity, the system calls {@link android.app.Activity#onPause onPause()} and the activity
|
||
waits in the Paused state (1). If the user returns to the activity while it's still paused, the
|
||
system calls {@link android.app.Activity#onResume onResume()} (2).</p>
|
||
|
||
|
||
<h2 id="Pause">Pause Your Activity</h2>
|
||
|
||
<p>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:</p>
|
||
|
||
<ul>
|
||
<li>Check if the activity is visible; if it is not, stop animations or other
|
||
ongoing actions that could consume CPU. Remember, beginning with Android
|
||
7.0, a paused app might be running in <a
|
||
href="{@docRoot}guide/topics/ui/multi-window.html">multi-window mode</a>.
|
||
In this case, you would not want to stop animations or video playback.</li>
|
||
<li>Commit unsaved changes, but only if users expect such changes to be permanently saved when
|
||
they leave (such as a draft email).</li>
|
||
<li>Release system resources, such as broadcast receivers, handles to sensors (like
|
||
GPS), or any resources that may affect battery life while your activity is paused and the user
|
||
does not need them.</li>
|
||
</ul>
|
||
|
||
<p>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.</p>
|
||
|
||
<pre>
|
||
@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;
|
||
}
|
||
}
|
||
</pre>
|
||
|
||
<p>Generally, you should <strong>not</strong> 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()}).</p>
|
||
|
||
<p>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.</p>
|
||
|
||
<p class="note"><strong>Note:</strong> 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.</p>
|
||
|
||
|
||
|
||
<h2 id="Resume">Resume Your Activity</h2>
|
||
|
||
<p>When the user resumes your activity from the Paused state, the system calls the {@link
|
||
android.app.Activity#onResume()} method.</p>
|
||
|
||
<p>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).</p>
|
||
|
||
<p>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.</p>
|
||
|
||
<pre>
|
||
@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
|
||
}
|
||
}
|
||
</pre>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|