fragment和activity生命周期

Posted zhouli_csdn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fragment和activity生命周期相关的知识,希望对你有一定的参考价值。

看到一篇fragment与activity的文章,写的很详细很好,转载过来,给大家分享!

【声明】 

欢迎转载,但请保留文章原始出处→_→ 

生命壹号:http://www.cnblogs.com/smyhvae/ 

文章来源:http://www.cnblogs.com/smyhvae/p/3983234.html

联系方式:smyhvae@163.com 

 

【正文】

上一章节中(Android系列之Fragment(一)----Fragment加载到Activity当中),我们对Fragment的生命周期进行了简单介绍,这一章节将对生命周期和返回栈进行详细介绍。

一、Fragment的生命周期初探:

因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。

如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。

但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。

当这样进行fragment transaction(转换)的时候,可以把fragment放入Activity的back stack中,这样用户就可以进行返回操作。

使用Fragment时,需要继承Fragment或者Fragment的子类(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代码看起来和Activity的类似。

每当创建一个Fragment时,首先添加以下三个回调方法:

  • onCreate():系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。
  • onCreateView():当第一次绘制Fragment的UI时系统调用这个方法,该方法将返回一个View,如果Fragment不提供UI也可以返回null。注意,如果继承自ListFragment,onCreateView()默认的实现会返回一个ListView,所以不用自己实现。
  • onPause():当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。

将Fragment加载到Activity当中有两种方式:

  • 方式一:添加Fragment到Activity的布局文件当中
  • 方式二:在Activity的代码中动态添加Fragment(荐)

第一种方式虽然简单但灵活性不够。添加Fragment到Activity的布局文件当中,就等同于将Fragment及其视图与activity的视图绑定在一起,且在activity的生命周期过程中,无法切换fragment视图。

第二种方式比较复杂,但也是唯一一种可以在运行时控制fragment的方式(加载、移除、替换)。

 

二、Fragment的生命周期详解:

先来看一下官方文档的图片吧:

 

我们再把Activity的生命周期和Fragment的生命周期对比一下,就清楚很多了:

我们还是在实例中来看一下Fragment的生命周期吧。

【实例】在MainActivity中加载一个Fragment:(完整版代码如下)

我们所创建的Fragment的布局文件fragment01.xml的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
<RatingBar android:id="@+id/ratingBar1" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" />

</LinearLayout>

MyFragment.java代码如下:(注意生命周期中每个方法的作用)

  1 package com.example.m01_fragmentlifecycle;
  2 
  3 import android.app.Activity;
  4 import android.app.Fragment;
  5 import android.os.Bundle;
  6 import android.util.Log;
  7 import android.view.LayoutInflater;
  8 import android.view.View;
  9 import android.view.ViewGroup;
 10 
 11 public class MyFragment extends Fragment 
 12     private final String TAG = "MyFragment";
 13     
 14     //获得activity的传递的值
 15     @Override
 16     public void onAttach(Activity activity) 
 17         // TODO Auto-generated method stub
 18         super.onAttach(activity);
 19         Log.i(TAG, "--MyFragment->>onAttach");
 20     
 21 
 22     //实例化成员变量
 23     @Override
 24     public void onCreate(Bundle savedInstanceState) 
 25         // TODO Auto-generated method stub
 26         super.onCreate(savedInstanceState);
 27         Log.i(TAG, "--MyFragment->>onCreate");
 28     
 29 
 30     //给当前的fragment绘制UI布局,可以使用线程更新UI
 31     @Override
 32     public View onCreateView(LayoutInflater inflater, ViewGroup container,
 33             Bundle savedInstanceState) 
 34         Log.i(TAG, "--MyFragment->>onCreateView");
 35         View view = inflater.inflate(R.layout.fragment01, null);
 36         // TODO Auto-generated method stub
 37         return view;
 38     
 39 
 40     //表示activity执行oncreate方法完成了的时候会调用此方法
 41     @Override
 42     public void onActivityCreated(Bundle savedInstanceState) 
 43         // TODO Auto-generated method stub
 44         super.onActivityCreated(savedInstanceState);
 45         Log.i(TAG, "--MyFragment->>onActivityCreated");
 46     
 47 
 48     //和activity一致
 49     @Override
 50     public void onStart() 
 51         // TODO Auto-generated method stub
 52         super.onStart();
 53         Log.i(TAG, "--MyFragment->>onStart");
 54     
 55 
 56     //和activity一致
 57     @Override
 58     public void onResume() 
 59         // TODO Auto-generated method stub
 60         super.onResume();
 61         Log.i(TAG, "--MyFragment->>onResume");
 62     
 63 
 64     //和activity一致
 65     @Override
 66     public void onPause() 
 67         // TODO Auto-generated method stub
 68         super.onPause();
 69         Log.i(TAG, "--MyFragment->>onPause");
 70     
 71 
 72     //和activity一致
 73     @Override
 74     public void onStop() 
 75         // TODO Auto-generated method stub
 76         super.onStop();
 77         Log.i(TAG, "--MyFragment->>onStop");
 78     
 79 
 80     //表示fragment销毁相关联的UI布局
 81     @Override
 82     public void onDestroyView() 
 83         // TODO Auto-generated method stub
 84         super.onDestroyView();
 85         Log.i(TAG, "--MyFragment->>onDestroyView");
 86     
 87 
 88     //销毁fragment对象
 89     @Override
 90     public void onDestroy() 
 91         // TODO Auto-generated method stub
 92         super.onDestroy();
 93         Log.i(TAG, "--MyFragment->>onDestroy");
 94     
 95 
 96     //脱离activity
 97     @Override
 98     public void onDetach() 
 99         // TODO Auto-generated method stub
100         super.onDetach();
101         Log.i(TAG, "--MyFragment->>onDetach");
102     
103 

activity_main.xml的代码如下:

<LinearLayout 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"
    android:orientation="horizontal"
    tools:context=".MainActivity" >

    <LinearLayout
        android:id="@+id/line"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    </LinearLayout>
    
</LinearLayout>

MainActivity.java的代码如下:

 1 package com.example.m01_fragmentlifecycle;
 2 
 3 import android.os.Bundle;
 4 import android.app.Activity;
 5 import android.app.FragmentManager;
 6 import android.app.FragmentTransaction;
 7 import android.util.Log;
 8 import android.view.Menu;
 9 
10 public class MainActivity extends Activity 
11     private final String TAG = "MainActivity";
12     private FragmentManager manager;
13     private FragmentTransaction transaction;
14 
15     @Override
16     protected void onCreate(Bundle savedInstanceState) 
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.activity_main);
19         manager = getFragmentManager();
20         transaction = manager.beginTransaction();
21         MyFragment fragment = new MyFragment();
22         transaction.add(R.id.line, fragment);
23         transaction.commit();
24         Log.i(TAG, "--MainActivity->>onCreate");
25     
26 
27     @Override
28     protected void onStart() 
29         // TODO Auto-generated method stub
30         super.onStart();
31         Log.i(TAG, "--MainActivity->>onStart");
32     
33 
34     @Override
35     protected void onResume() 
36         // TODO Auto-generated method stub
37         super.onResume();
38         Log.i(TAG, "--MainActivity->>onResume");
39     
40 
41     @Override
42     protected void onPause() 
43         // TODO Auto-generated method stub
44         super.onPause();
45         Log.i(TAG, "--MainActivity->>onPause");
46     
47 
48     @Override
49     protected void onStop() 
50         // TODO Auto-generated method stub
51         super.onStop();
52         Log.i(TAG, "--MainActivity->>onStop");
53     
54     
55     @Override
56     protected void onRestart() 
57         // TODO Auto-generated method stub
58         super.onRestart();
59         Log.i(TAG, "--MainActivity->>onRestart");
60     
61     @Override
62     protected void onDestroy() 
63         // TODO Auto-generated method stub
64         super.onDestroy();
65         Log.i(TAG, "--MainActivity->>onDestroy");
66 以上是关于fragment和activity生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Android Fragment 隐藏或显示时调用的生命周期方法

android fragment相互切换的时候生命周期怎么走

Fragment和Activity生命周期以及横竖屏切换对生命周期的影响

Activity生命周期

Fragment生命周期

Fragment的生命周期