私が知っていることから、GC は VM 内のすべてのオブジェクトに対して実行され、オブジェクトへの参照がない場合は削除されます。独自のライフサイクルを持つ Android アクティビティについては少し異なります。
Android が他のアプリ (アクティビティ) 用により多くの RAM を必要とする場合、アクティビティ onSaveInstanceState (Bundle outState)
で が呼び出されます。この場所に、必要なものをすべて保存する必要がありますBundle
。ユーザーがアクティビティに戻ったら、それらのオブジェクトをonRestoreInstanceState(Bundle savedInstanceState)
.
編集:例として私のアプリの一部:
public class Window {
public Window(Bundle bundle) {
maximized = bundle.getBoolean("maximized", maximized);
displayed = bundle.getBoolean("displayed", displayed);
minimized = bundle.getBoolean("minimized", minimized);
resizable = bundle.getBoolean("resizable", resizable);
orientation = bundle.getInt("orientation");
}
public Bundle bundle() {
Bundle bundle = new Bundle();
bundle.putBoolean("maximized", maximized);
bundle.putBoolean("displayed", displayed);
bundle.putBoolean("minimized", minimized);
bundle.putBoolean("resizable", resizable);
bundle.putInt("orientation", orientation);
return bundle;
}
}
そして MainActivity:
public class MainActivity extends Activity {
ArrayList<Window> windows;
[...]
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Bundle[] windowsBundle = new Bundle[windows.size()];
for(int i=0; i<windowsBundle.length; i++){
windowsBundle[i] = windows.get(i).bundle();
}
savedInstanceState.putParcelableArray("windows", windowsBundle);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
Parcelable[] windowsParcels = savedInstanceState.getParcelableArray("windows");
Bundle[] windowsBundle = (Bundle[]) Arrays.copyOf(windowsParcels, windowsParcels.length, Bundle[].class);
windowsParcels = null;
for(int i=0; i<windowsBundle.length; i++){
windows.add(new Window(windowsBundle[i]));
}
}
}