page.title=Handling Runtime Changes
page.tags="activity","lifecycle"
@jd:body

<div id="qv-wrapper">
<div id="qv">

  <h2>In this document</h2>
  <ol>
    <li><a href="#RetainingAnObject">Retaining an Object During a Configuration Change</a></li>
    <li><a href="#HandlingTheChange">Handling the Configuration Change Yourself</a>
  </ol>

  <h2>See also</h2>
  <ol>
    <li><a href="providing-resources.html">Providing Resources</a></li>
    <li><a href="accessing-resources.html">Accessing Resources</a></li>
    <li><a href="http://android-developers.blogspot.com/2009/02/faster-screen-orientation-change.html">Faster
        Screen Orientation Change</a></li>
  </ol>
</div>
</div>

<p>Some device configurations can change during runtime
(such as screen orientation, keyboard availability, and language). When such a change occurs,
Android restarts the running
{@link android.app.Activity} ({@link android.app.Activity#onDestroy()} is called, followed by {@link
android.app.Activity#onCreate(Bundle) onCreate()}). The restart behavior is designed to help your
application adapt to new configurations by automatically reloading your application with
alternative resources that match the new device configuration.</p>

<p>To properly handle a restart, it is important that your activity restores its previous
state through the normal <a
href="{@docRoot}guide/components/activities.html#Lifecycle">Activity
lifecycle</a>, in which Android calls
{@link android.app.Activity#onSaveInstanceState(Bundle) onSaveInstanceState()} before it destroys
your activity so that you can save data about the application state. You can then restore the state
during {@link android.app.Activity#onCreate(Bundle) onCreate()} or {@link
android.app.Activity#onRestoreInstanceState(Bundle) onRestoreInstanceState()}.</p>

<p>To test that your application restarts itself with the application state intact, you should
invoke configuration changes (such as changing the screen orientation) while performing various
tasks in your application. Your application should be able to restart at any time without loss of
user data or state in order to handle events such as configuration changes or when the user receives
an incoming phone call and then returns to your application much later after your application
process may have been destroyed. To learn how you can restore your activity state, read about the <a
href="{@docRoot}guide/components/activities.html#Lifecycle">Activity lifecycle</a>.</p>

<p>However, you might encounter a situation in which restarting your application and
restoring significant amounts of data can be costly and create a poor user experience. In such a
situation, you have two other options:</p>

<ol type="a">
  <li><a href="#RetainingAnObject">Retain an object during a configuration change</a>
  <p>Allow your activity to restart when a configuration changes, but carry a stateful
object to the new instance of your activity.</p>

  </li>
  <li><a href="#HandlingTheChange">Handle the configuration change yourself</a>
  <p>Prevent the system from restarting your activity during certain configuration
changes, but receive a callback when the configurations do change, so that you can manually update
your activity as necessary.</p>
  </li>
</ol>


<h2 id="RetainingAnObject">Retaining an Object During a Configuration Change</h2>

<p>If restarting your activity requires that you recover large sets of data, re-establish a network
connection, or perform other intensive operations, then a full restart due to a configuration change
might be a slow user experience. Also, it might not be possible for you to completely restore your
activity state with the {@link android.os.Bundle} that the system saves for you with the {@link
android.app.Activity#onSaveInstanceState(Bundle) onSaveInstanceState()} callback&mdash;it is not
designed to carry large objects (such as bitmaps) and the data within it must be serialized then
deserialized, which can consume a lot of memory and make the configuration change slow. In such a
situation, you can alleviate the burden of reinitializing your activity by retaining a {@link
android.app.Fragment} when your activity is restarted due to a configuration change. This fragment
can contain references to stateful objects that you want to retain.</p>

<p>When the Android system shuts down your activity due to a configuration change, the fragments
of your activity that you have marked to retain are not destroyed. You can add such fragments to
your activity to preserve stateful objects.</p>

<p>To retain stateful objects in a fragment during a runtime configuration change:</p>

<ol>
  <li>Extend the {@link android.app.Fragment} class and declare references to your stateful 
      objects.</li>
  <li>Call {@link android.app.Fragment#setRetainInstance(boolean)} when the fragment is created.
      </li>
  <li>Add the fragment to your activity.</li>
  <li>Use {@link android.app.FragmentManager} to retrieve the fragment when the activity is 
      restarted.</li>
</ol>

<p>For example, define your fragment as follows:</p>

<pre>
public class RetainedFragment extends Fragment {

    // data object we want to retain
    private MyDataObject data;

    // this method is only called once for this fragment
    &#64;Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain this fragment
        setRetainInstance(true);
    }

    public void setData(MyDataObject data) {
        this.data = data;
    }

    public MyDataObject getData() {
        return data;
    }
}
</pre>

<p class="caution"><strong>Caution:</strong> While you can store any object, you
should never pass an object that is tied to the {@link android.app.Activity}, such as a {@link
android.graphics.drawable.Drawable}, an {@link android.widget.Adapter}, a {@link android.view.View}
or any other object that's associated with a {@link android.content.Context}. If you do, it will
leak all the views and resources of the original activity instance. (Leaking resources
means that your application maintains a hold on them and they cannot be garbage-collected, so
lots of memory can be lost.)</p>

<p>Then use {@link android.app.FragmentManager} to add the fragment to the activity. 
You can obtain the data object from the fragment when the activity starts again during runtime 
configuration changes. For example, define your activity as follows:</p>

<pre>
public class MyActivity extends Activity {

    private RetainedFragment dataFragment;

    &#64;Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // find the retained fragment on activity restarts
        FragmentManager fm = getFragmentManager();
        dataFragment = (DataFragment) fm.findFragmentByTag(“data”);

        // create the fragment and data the first time
        if (dataFragment == null) {
            // add the fragment
            dataFragment = new DataFragment();
            fm.beginTransaction().add(dataFragment, “data”).commit();
            // load the data from the web
            dataFragment.setData(loadMyData());
        }

        // the data is available in dataFragment.getData()
        ...
    }

    &#64;Override
    public void onDestroy() {
        super.onDestroy();
        // store the data in the fragment
        dataFragment.setData(collectMyLoadedData());
    }
}
</pre>

<p>In this example, {@link android.app.Activity#onCreate(Bundle) onCreate()} adds a fragment
or restores a reference to it. {@link android.app.Activity#onCreate(Bundle) onCreate()} also
stores the stateful object inside the fragment instance.
{@link android.app.Activity#onDestroy() onDestroy()} updates the stateful object inside the 
retained fragment instance.</p>





<h2 id="HandlingTheChange">Handling the Configuration Change Yourself</h2>

<p>If your application doesn't need to update resources during a specific configuration
change <em>and</em> you have a performance limitation that requires you to
avoid the activity restart, then you can declare that your activity handles the configuration change
itself, which prevents the system from restarting your activity.</p>

<p class="note"><strong>Note:</strong> Handling the configuration change yourself can make it much
more difficult to use alternative resources, because the system does not automatically apply them
for you. This technique should be considered a last resort when you must avoid restarts due to a
configuration change and is not recommended for most applications.</p>

<p>To declare that your activity handles a configuration change, edit the appropriate <a
href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> element in
your manifest file to include the <a
href="{@docRoot}guide/topics/manifest/activity-element.html#config">{@code
android:configChanges}</a> attribute with a value that represents the configuration you want to
handle. Possible values are listed in the documentation for the <a
href="{@docRoot}guide/topics/manifest/activity-element.html#config">{@code
android:configChanges}</a> attribute (the most commonly used values are {@code "orientation"} to
prevent restarts when the screen orientation changes and {@code "keyboardHidden"} to prevent
restarts when the keyboard availability changes).  You can declare multiple configuration values in
the attribute by separating them with a pipe {@code |} character.</p>

<p>For example, the following manifest code declares an activity that handles both the
screen orientation change and keyboard availability change:</p>

<pre>
&lt;activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">
</pre>

<p>Now, when one of these configurations change, {@code MyActivity} does not restart.
Instead, the {@code MyActivity} receives a call to {@link
android.app.Activity#onConfigurationChanged(Configuration) onConfigurationChanged()}. This method
is passed a {@link android.content.res.Configuration} object that specifies
the new device configuration. By reading fields in the {@link android.content.res.Configuration},
you can determine the new configuration and make appropriate changes by updating
the resources used in your interface. At the
time this method is called, your activity's {@link android.content.res.Resources} object is updated
to return resources based on the new configuration, so you can easily
reset elements of your UI without the system restarting your activity.</p>

<p class="caution"><strong>Caution:</strong> Beginning with Android 3.2 (API level 13), <strong>the
"screen size" also changes</strong> when the device switches between portrait and landscape
orientation. Thus, if you want to prevent runtime restarts due to orientation change when developing
for API level 13 or higher (as declared by the <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> and <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a>
attributes), you must include the {@code "screenSize"} value in addition to the {@code
"orientation"} value. That is, you must decalare {@code
android:configChanges="orientation|screenSize"}. However, if your application targets API level
12 or lower, then your activity always handles this configuration change itself (this configuration
change does not restart your activity, even when running on an Android 3.2 or higher device).</p>

<p>For example, the following {@link
android.app.Activity#onConfigurationChanged(Configuration) onConfigurationChanged()} implementation
checks the current device orientation:</p>

<pre>
&#64;Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
</pre>

<p>The {@link android.content.res.Configuration} object represents all of the current
configurations, not just the ones that have changed. Most of the time, you won't care exactly how
the configuration has changed and can simply re-assign all your resources that provide alternatives
to the configuration that you're handling. For example, because the {@link
android.content.res.Resources} object is now updated, you can reset
any {@link android.widget.ImageView}s with {@link android.widget.ImageView#setImageResource(int)
setImageResource()}
and the appropriate resource for the new configuration is used (as described in <a
href="providing-resources.html#AlternateResources">Providing Resources</a>).</p>

<p>Notice that the values from the {@link
android.content.res.Configuration} fields are integers that are matched to specific constants
from the {@link android.content.res.Configuration} class. For documentation about which constants
to use with each field, refer to the appropriate field in the {@link
android.content.res.Configuration} reference.</p>

<p class="note"><strong>Remember:</strong> When you declare your activity to handle a configuration
change, you are responsible for resetting any elements for which you provide alternatives. If you
declare your activity to handle the orientation change and have images that should change
between landscape and portrait, you must re-assign each resource to each element during {@link
android.app.Activity#onConfigurationChanged(Configuration) onConfigurationChanged()}.</p>

<p>If you don't need to update your application based on these configuration
changes, you can instead <em>not</em> implement {@link
android.app.Activity#onConfigurationChanged(Configuration) onConfigurationChanged()}. In
which case, all of the resources used before the configuration change are still used
and you've only avoided the restart of your activity. However, your application should always be
able to shutdown and restart with its previous state intact, so you should not consider this
technique an escape from retaining your state during normal activity lifecycle. Not only because
there are other configuration changes that you cannot prevent from restarting your application, but
also because you should handle events such as when the user leaves your application and it gets
destroyed before the user returns to it.</p>

<p>For more about which configuration changes you can handle in your activity, see the <a
href="{@docRoot}guide/topics/manifest/activity-element.html#config">{@code
android:configChanges}</a> documentation and the {@link android.content.res.Configuration}
class.</p>
