title: Why does EditText retain its Activity's Context in Ice Cream Sandwich
body: <p>In Ice Cream Sandwich, when there's an Activity containing an EditText, the EditText will retain the Activity's Context even after the user leaves the Activity. To demonstrate this I've created TestLeakActivity, which allocates a large byte array. Since the Activity's Context is never garbage collected, the byte arrays accumulate on the heap, eventually causing an OutOfMemoryError. You can observe the heap growth by using the DDMS heap tool, and you can track the outstanding references to the EditText class by looking at the HPROF file in Eclipse MAT. To create memory leaks, go into LaunchActivity and just keep launching and backing out of TestLeakActivity.</p>
  
  <pre>LaunchActivity.java</pre>
  
  <pre>
  package com.example.testleakproject;
  
  import android.app.Activity;
  import android.content.Intent;
  import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.view.ViewGroup;
  import android.widget.Button;
  import android.widget.TextView;
  
  public class LaunchActivity extends Activity {
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          Button button = new Button(this);
          button.setText("Start TestLeakActivity");
          button.setOnClickListener(new OnClickListener() {
              @Override
              public void onClick(View v) {
                  Intent intent = new Intent(LaunchActivity.this, TestLeakActivity.class);
                  startActivity(intent);
              }
          });
  
          ViewGroup container = ((ViewGroup) findViewById(android.R.id.content));
          container.addView(button);
      }
  }
  </pre>
  
  <pre>TestLeakActivity.java</pre>
  
  <pre>
  package com.example.testleakproject;
  
  import android.app.Activity;
  import android.os.Bundle;
  import android.view.ViewGroup;
  import android.widget.EditText;
  
  public class TestLeakActivity extends Activity {
      private byte[] mSomeBytes = new byte[1048576];
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          EditText editText = new EditText(this);
          editText.setHint("TestLeakActivity");
  
          ViewGroup container = ((ViewGroup) findViewById(android.R.id.content));
          container.addView(editText);
      }
  }
  </pre>