知らなかったよ。Androidって色んなタイミングでActivityが再作成されるんだね。Androidの仕組み的に。
で、その自動再生成のタイミングの指定がManifestにもある、configChangeというものらしい。
android:configChanges=["mcc", "mnc", "locale",
http://developer.android.com/guide/topics/manifest/activity-element.html
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale", "uiMode",
"orientation", "screenSize", "smallestScreenSize"]
デフォルトはこれっぽくて、色んなタイミングでActivity再生成される雰囲気をビンビンに感じる。ただ、できればこういうふうにハンドリングしたほうがええって公式に書いてあった。フラグメントにタグを忍ばせておけってさ。こうすればドロワー等で動的にFragmentを入れ替える処理を入れない限り1回しか初期化されないことが保証される。
Handling Runtime Changes | Android Developers
public class MyActivity extends Activity { private RetainedFragment dataFragment; @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() ... }
ドロワーでFragment切り替えちゃってる場合は、該当のActivityのメンバ変数にstaticでタグを保存すること。staticにしないとActivity再生成のタイミングでメンバ変数は全部初期化されるので、常に初期化時に追加したFragmentを取得してしまう。staticにしておけばActivityのライフサイクルに依らないので、アプリが落とされるまで保有される。こーゆー時にstatic使うのは便利ね。