首页 > 代码库 > Fragment生命周期(转)

Fragment生命周期(转)

 

    Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互.Fragment允许这样的一种设计,而不需要你亲自来管理viewhierarchy的复杂变化. 通过将activity的布局分散到fragment中, 你可以在运行时修改activity的外观,并在由activity管理的back stack中保存那些变化。
   例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输入事件. 因此, 取代使用一个activity来选择一篇文章,而另一个activity来阅读文章 的方式,用户可以在相同的activity中选择一篇文章并且阅读, 如图所示: 

1
  和Activity一样,Fragment也有自己的生命周期。 一个Fragment必须总是嵌入在一个Activity中,同时Fragment的生命周期受Activity而影响。

Activity的生命周期

Fragment生命周期

Activity的生命周期影响Fragment的生命周期

下面通过程序来观察Fragment的生命周期

第一步:新建一个Android工程命名为FragmentLifecycle目录结构如下图:

第二步:修改activity_main.xml布局文件代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="cn.eoe.leigo.lifecycle.MyFragment" />

</RelativeLayout>

第三步:编写MainActivity类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package cn.eoe.leigo.lifecycle;

import cn.eoe.leigo.fragment.R;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "-----Activity onCreate-----");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "-----Activity onStart-----");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "-----Activity onRestart-----");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "-----Activity onResume-----");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "-----Activity onPause-----");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "-----Activity onStop-----");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "-----Activity onDestroy-----");
    }
}

第四步:编写MyFragment类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package cn.eoe.leigo.lifecycle;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyFragment extends Fragment {
    private static final String TAG = "MyFragment";

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.d(TAG, "----------Fragment onAttach----------");
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "----------Fragment onCreate----------");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Log.d(TAG, "----------Fragment onCreateView----------");
        TextView textView = new TextView(getActivity());
        textView.setText("欢迎来到石头的博客");
        return textView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d(TAG, "----------Fragment onActivityCreated----------");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG, "----------Fragment onStart----------");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "----------Fragment onResume----------");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "----------Fragment onPause----------");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG, "----------Fragment onStop----------");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d(TAG, "----------Fragment onDestroyView----------");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "----------Fragment onDestroy----------");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d(TAG, "----------Fragment onDetach----------");
    }

}

通过查看Log可以看到
显示到前台时:

MyFragment onAttach() fragment关联到activity上
MyFragment onCreate() fragment创建
MyFragment onCreateView() fragment创建自己的视图

MainActivity onCreate()
MyFragment onActivityCreated() 可以处理fragment数据的初始化

MainActivity onStart()
MyFragment onStart()

MainActivity onResume()
MyFragment onResume()

按后退键时:

MyFragment onPause()
MainActivity onPause()

MyFragment onStop()
MainActivity onStop()

MyFragment onDestoryView() 销毁掉自己的视图
MyFragment onDestory()
MyFragment onDetach() 解除和activity的关联

MainActivity onDetory()

声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息

原文作者: gaolei_xj