読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Activity生成時に1回しか行ってほしくない処理の実装

知らなかったよ。Androidって色んなタイミングでActivityが再作成されるんだね。Androidの仕組み的に。

で、その自動再生成のタイミングの指定がManifestにもある、configChangeというものらしい。

android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale", "uiMode",
"orientation", "screenSize", "smallestScreenSize"]

http://developer.android.com/guide/topics/manifest/activity-element.html

デフォルトはこれっぽくて、色んなタイミングで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使うのは便利ね。