lack state, if you were using other widgets (e.g., EditText
), you would even find that Android hangs onto some of the widget state for you (e.g., the text entered in the EditText
).
What Android cannot automatically help you with is anything held outside the widgets.
This application is derived from the Pick demo used in Chapter 24. There, clicking one button would let you pick a contact, then view the contact. Here, we split those into separate buttons, with the “View” button only enabled when we actually have a contact.
Let’s see how we handle this, using onSaveInstanceState()
:
public class RotationOneDemo extends Activity {
static final int PICK_REQUEST = 1337;
Button viewButton = null;
Uri contact = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.pick);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent i = new Intent(Intent.ACTION_PICK,
Uri.parse('content://contacts/people'));
startActivityForResult(i, PICK_REQUEST);
}
});
viewButton = (Button)findViewById(R.id.view);
viewButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
startActivity(new Intent(Intent.ACTION_VIEW, contact));
}
});
restoreMe(savedInstanceState);
viewButton.setEnabled(contact!=null);
}
@Override protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode==PICK_REQUEST) {
if (resultCode==RESULT_OK) {
contact = data.getData();
viewButton.setEnabled(true);
}
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (contact!=null) {
outState.putString('contact', contact.toString ());
}
}
private void restoreMe(Bundle state) {
contact = null;
if (state!=null) {
String contactUri = state.getString('contact');
if (contactUri!=null) {
contact = Uri.parse(contactUri);
}
}
}
}
By and large, it looks like a normal activity… because it is. Initially, the “model” — a Uri
named contact
— is null. It is set as the result of spawning the ACTION_PICK
sub-activity. Its string representation is saved in onSaveInstanceState()
and restored in restoreMe()
(called from onCreate()
). If the contact is not null, the “View” button is enabled and can be used to view the chosen contact.
Visually, it looks like Figures 26-1 and 26-2.

Figure 26-1.

Figure 26-2.
The benefit to this implementation is that it handles a number of system events beyond mere rotation, such as being closed by Android due to low memory.
For fun, comment out the restoreMe()
call in onCreate()
and try running the application. You will see that the application “forgets” a contact selected in one orientation when you rotate the emulator or device.