Недавно я узнал, сколько памяти можно потратить из-за утечки контекста и как проверить наличие таких утечек с помощью дампа памяти после изменения ориентации экрана. Новое действие должно быть создано и создано, оригинальное уничтожено и собрано. Однако, если у меня нет утечки памяти и я не вижу ее, то приведенное ниже действие, похоже, не собирается, если оно запускает другое действие и разрушает себя:
public class Foo extends Activity {
private Button button;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
button = new Button(this);
button.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
startActivity(new Intent(Foo.this, Bar.class));
finish();
}
});
setContentView(button);
}
protected void onDestroy() {
super.onDestroy();
button.setOnClickListener(null);
Log.e("you're it", "isFinishing() == " + isFinishing());
}
}
public class Bar extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText("hello, world");
setContentView(textView);
}
}
Вот информация о дампе памяти, взятая после нажатия кнопки, чтобы запустить панель и несколько раз запросить сборку мусора:
Class Name | Shallow Heap | Retained Heap
----------------------------------------------------------------------------------------
com.test.testProject.Foo @ 0x4135b188 | 184 | 2,208
mOuterContext android.app.ContextImpl @ 0x4135b390 | 96 | 392
<Java Local> java.lang.Thread @ 0x40996460 main Thread| 80 | 1,416
mContext android.media.AudioManager @ 0x4135b480 | 48 | 176
----------------------------------------------------------------------------------------
Исходя из этого , я подумал, что дополнительный финиш между действиями сделает первый из них подходящим для сбора и позволит мне дополнительно проверить наличие утечек, это разумно? Я теряю память? Есть ли какая-то причина, по которой Android захочет сохранить эту разрушенную активность?