Fragmentのライフサイクルの確認 その1

はじめに

Android 3.2のSDKが公開されました。今回はFragmentのライフサイクルを確認します。
ソースコードが公開されていないので、確認方法はLogにExceptionを吐かせてコールスタックのログを取得しました。

調査環境

Android SDK 3.2(APIレベル13)

LayoutファイルにFragmentを挿入

LayoutファイルにFragmentタグを挿入して、LayoutからFragmentを読み込ませます。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <fragment android:name="com.mydroid.fragmenttest.fragment.FragmentSample"  
            android:id="@+id/fragmentsample"  
            android:layout_height="match_parent" 
            android:layout_width="match_parent"/> 
</LinearLayout>


Fragmentを継承したFragmentSampleを作成し、各メソッドにログを仕込みました。

public class FragmentSample extends Fragment {
	final String TAG ="FragmentSample";
	
    @Override
    public void onAttach(Activity act){
        super.onAttach(act);
        Log.e(TAG,"onAttach", new Exception() );
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e(TAG,"onCreate", new Exception()  );
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.e(TAG,"onCreateView", new Exception() );
        return inflater.inflate(R.layout.fragmentsample ,container,false);
    }

    @Override
    public void onActivityCreated(Bundle bundle){
        super.onActivityCreated(bundle);
        Log.e(TAG,"onActivityCreated", new Exception() );
    }

    @Override
    public void onStart(){
        super.onStart();
        Log.e(TAG,"onStart", new Exception() );
    }

    @Override
    public void onResume(){
        super.onResume();
        Log.e(TAG,"onResume", new Exception() );
    }

    @Override
    public void onPause(){
        super.onPause();
        Log.e(TAG,"onPause", new Exception() );
    }

    @Override
    public void onStop(){
        super.onStop();
        Log.e(TAG,"onStop", new Exception() );
    }

    @Override
    public void onDestroyView(){
        super.onDestroyView();
        Log.e(TAG,"onDestroyView", new Exception() );
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.e(TAG,"onDestroy", new Exception() );
    }

    @Override
    public void onDetach(){
        super.onDetach();
        Log.e(TAG,"onDetach", new Exception() );
    }
}

Activity#onCreate()にて呼ばれるFragmentメソッド

DeveloperサイトのFragmentライフサイクルの説明図に以下の記載があります。

  • ActivityがCreated状態で影響があるFragmentメソッド
    • onAttach
    • onCreate
    • onCreateView
    • onActivityCreated

では、先ほど仕込んだ各メソッドのコールスタックを見てみましょう。

onAttach()のログ
onAttach
java.lang.Exception
    at com.mydroid.fragmenttest.fragment.FragmentSample.onAttach(FragmentSample.java:19)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:734)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
    at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
    at android.app.Activity.onCreateView(Activity.java:4177)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223)
    at android.app.Activity.setContentView(Activity.java:1786)
    at com.mydroid.fragmenttest.FragmentTest.onCreate(FragmentTest.java:11)
    at android.app.Activity.performCreate(Activity.java:4397)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
    at android.app.ActivityThread.access$500(ActivityThread.java:122)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:132)
    at android.app.ActivityThread.main(ActivityThread.java:4123)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    at dalvik.system.NativeStart.main(Native Method)
onCreate()のログ
onCreate
java.lang.Exception
    at com.mydroid.fragmenttest.fragment.FragmentSample.onCreate(FragmentSample.java:25)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:743)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
    at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
    at android.app.Activity.onCreateView(Activity.java:4177)
    (※以降はonAttachと同じため割愛)
onCreateView()のログ
onCreateView
java.lang.Exception
    at com.mydroid.fragmenttest.fragment.FragmentSample.onCreateView(FragmentSample.java:30)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:754)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
    at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
    at android.app.Activity.onCreateView(Activity.java:4177)
    (※以降はonAttachと同じため割愛)
onActivityCreated()のログ
onActivityCreated
java.lang.Exception
    at com.mydroid.fragmenttest.fragment.FragmentSample.onActivityCreated(FragmentSample.java:37)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:795)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:977)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:960)
    at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1674)
    at android.app.Activity.performCreate(Activity.java:4400)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
    (※以降はonAttachと同じため割愛)
わかったこと

ログから判明したこと。

  • 各FragmentメソッドはActivity.performCreate()の一連処理から呼ばれているっぽい
  • LayoutファイルにFragmentを挿入すると、Activity#setContentView()の一連処理からアプリ側のFragmentメソッドがコールされる
  • FragmentManagerクラスを継承?したFragmentManagerImplのmoveToStateメソッドから、アプリ側のFragmentメソッドがコールされる
  • onAttach(),onCreate(),onCreateView()はActivity#setContentView() → Activity#onCreateView() → FragmentManagerImplクラスから呼ばれる
  • onActivityCreated()はActivity#performCreate() → FragmentManagerImpl#dispatchActivityCreated()から呼ばれる
関連クラス図

ログ上からわかったクラスを図にまとめました。
(※ログ上から得た情報なので、実際とはことなる可能性大です)