Fragment生命周期探究

探究Android Fragment生命周期,我们先从一个demo入手,首先定义两个Fragment,LeftFragment和RightFragment,我们在生命周期的各方法中加入相应的日志,RightFragment类似。

public class LeftFragment extends Fragment {

    public static final String TAG = "LeftFragment  ";


    public LeftFragment() {
        // Required empty public constructor
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.e("weilei", TAG + "onAttach");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e("weilei", TAG + "onCreate");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.e("weilei", TAG + "onCreateView");
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_left, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.e("weilei", TAG + "onActivityCreated");
    }

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

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

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

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

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

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

    @Override
    public void onDetach() {
        super.onDetach();
        Log.e("weilei", TAG + "onDetach");
    }
}
然后在Activity中添加这个Fragment。

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button_add).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.add(R.id.frame, new LeftFragment());
                ft.addToBackStack(null);
                ft.commit();
            }
        });

        findViewById(R.id.button_repalce).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.frame, new RightFragment());
                ft.addToBackStack(null);
                ft.commit();
            }
        });
    }


布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">
        <Button
            android:id="@+id/button_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add"
            android:textSize="20sp"
            />
        <Button
            android:id="@+id/button_repalce"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Replace"
            android:textSize="20sp"
            />
    </LinearLayout>

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary"
        >

    </FrameLayout>

</LinearLayout>
1、运行一下,点击左侧的Add按钮,结果如下:

08-02 10:32:37.731 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onAttach
08-02 10:32:37.731 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onCreate
08-02 10:32:37.731 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onCreateView
08-02 10:32:37.732 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onActivityCreated
08-02 10:32:37.732 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onStart
08-02 10:32:37.732 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onResume
点击back:

08-02 10:33:13.541 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onPause
08-02 10:33:13.566 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onStop
08-02 10:33:13.566 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onDestroyView
08-02 10:33:13.566 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onDestroy
08-02 10:33:13.566 2842-2842/com.weilei.fragdemo E/weilei: LeftFragment  onDetach

可以看到Fragment的生命周期的过程。


2、重新进入,先点击左侧的Replace按钮,结果如下:

08-02 11:39:39.889 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onAttach
08-02 11:39:39.889 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onCreate
08-02 11:39:39.890 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onCreateView
08-02 11:39:39.891 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onActivityCreated
08-02 11:39:39.891 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onStart
08-02 11:39:39.891 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onResume
再点击一下Replace按钮:

08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onPause
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onStop
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onDestroyView
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onAttach
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onCreate
08-02 11:40:25.222 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onCreateView
08-02 11:40:25.223 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onActivityCreated
08-02 11:40:25.223 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onStart
08-02 11:40:25.223 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onResume
点击back:

08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onPause
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onStop
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onDestroyView
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onDestroy
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onDetach
08-02 11:41:23.106 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onCreateView
08-02 11:41:23.107 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onActivityCreated
08-02 11:41:23.108 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onStart
08-02 11:41:23.108 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onResume

再点击back:

08-02 11:42:33.624 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onPause
08-02 11:42:33.624 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onStop
08-02 11:42:33.624 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onDestroyView
08-02 11:42:33.626 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onDestroy
08-02 11:42:33.626 22195-22195/com.weilei.fragdemo E/weilei: RightFragment  onDetach
通过这个可以体会replace和add的区别。


3、连续点两次Add:

08-02 12:05:55.441 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onAttach
08-02 12:05:55.441 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onCreate
08-02 12:05:55.441 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onCreateView
08-02 12:05:55.442 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onActivityCreated
08-02 12:05:55.442 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onStart
08-02 12:05:55.442 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onResume
08-02 12:05:57.719 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onAttach
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onCreate
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onCreateView
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onActivityCreated
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onStart
08-02 12:05:57.720 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onResume
连续两次replace:

08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onPause
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onStop
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onDestroyView
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onAttach
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onCreate
08-02 12:06:25.231 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onCreateView
08-02 12:06:25.232 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onActivityCreated
08-02 12:06:25.232 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onStart
08-02 12:06:25.232 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onResume
08-02 12:06:25.482 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onPause
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onStop
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onDestroyView
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onAttach
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onCreate
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onCreateView
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onActivityCreated
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onStart
08-02 12:06:25.483 8762-8762/com.weilei.fragdemo E/weilei: RightFragment  onResume
连续两次back:

08-02 12:07:05.323 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onDestroy
08-02 12:07:05.323 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onDetach
08-02 12:07:06.066 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onDestroy
08-02 12:07:06.066 8762-8762/com.weilei.fragdemo E/weilei: LeftFragment  onDetach
再次back就直接退出。

通过这个可以好好体会栈和add以及replace的关系。

总结:

1、一个FragmentTransaction只能commit()一次,所以每次最好重新构造一个,否则会抛出异常。

2、addToBackStack能够做到按照添加顺序一次退出,只要addToBackStack一次,栈中的对象就会多一次。

3、同一个Fragement对象只能add一次,否则会抛出java.lang.IllegalStateException: Fragment already added异常

4、同一个Fragement对象可以replace多次,但是只会存在一个实例,可以addToBackStack多次。

5.使用getSupportFragmentManager,当api>=14时,使用getFragmentManager(),有时候使用Fragment的时候为了兼容低版本,会引入android-support-v4.jar支持包,这个时候,需要使用getSupportFragmentManager()。

6.Fragment使用support.v4中的,为了兼容低版本的。

7、add会不断往frame容器中添加实例,而replace仅当容器为空的时候添加一个实例,之后只会不断替换原有的实例,不会增加容器中实例的数量。

8、replace的替换方式是从栈底的fragment实例开始替换。

9、add后添加进栈,退栈的时候只会执行自己的销毁操作;replace后添加进栈,退栈时除了执行自己的销毁操作,还会执行所替换的那个fragment的创建工作。

10、可以理解为栈可以保存到底是add还是replace的操作。

11、只有addToBackStack,再执行replace的时候只会执行到onDestroryView,而不执行onDestroty和onDetach。

猜你喜欢

转载自blog.csdn.net/wei_lei/article/details/76572037