Fragmentのライフサイクルの確認 その1
はじめに
Android 3.2のSDKが公開されました。今回はFragmentのライフサイクルを確認します。
ソースコードが公開されていないので、確認方法はLogにExceptionを吐かせてコールスタックのログを取得しました。
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()から呼ばれる