试水Fragment(4)-重要的生命周期

本文深入探讨了Android中Fragment的生命周期及其重要方法,包括onCreate、onCreateView、onPause等,并通过示例代码展示了Fragment如何与Activity交互及生命周期的管理。

试水Fragment,了解它的生命周期和相关方法是很重要的一个环节,让我们参考官方文档进行分析:

http://www.android-doc.com/guide/components/fragments.html 

Fragment lifecycle.png

要创建一个fragment,必须创建一个fragment的子类(或是继承自它的子类)。fragment类的代码看起来很像activity。它与activity一样都有回调函数,例如onCreate(),onStart(),onPause(),和onStop()。事实上,如果你正在将一个现成的Android应用转而使用Fragment来实现,可以简单的将代码从activity的回调函数移植到各自的fragment回调函数中。

一般情况下,你至少需要实现以下几个生命周期方法:

onCreate()

在创建fragment时系统会调用此方法。在实现代码中,你可以初始化想要在fragment中保持的那些必要组件,当fragment处于暂停或者停止状态之后可重新启用它们。

onCreateView()

在第一次为fragment绘制用户界面时系统会调用此方法。为fragment绘制用户界面,这个函数必须要返回所绘出的fragment的根View。如果fragment没有用户界面可以返回空。

onPause()

系统回调用该函数作为用户离开fragment的第一个预兆(尽管这并不总意味着fragment被销毁)。在当前用户会话结束之前,通常要在这里提交任何应该持久化的变化(因为用户可能不再返回)。

大部分应用程序都应该至少为每个fragment实现这三个方法,但是还有许多其他用以操纵fragment生命周期中各个阶段的回调函数。

管理fragment生命周期与管理activity生命周期很相像。像activity一样,fragment也有三种状态:

Resumed

fragment在运行中的activity可见。

Paused

另一个activity处于前台且得到焦点,但是这个fragment所在的activity仍然可见(前台activity部分透明,或者没有覆盖全屏)。

Stopped

fragment不可见。要么宿主activity已经停止,要么fragment已经从activity上移除,但已被添加到后台栈中。一个停止的fragment仍然活着(所有状态和成员信息仍然由系统保留着)。但是,它对用户来讲已经不再可见,并且如果activity被杀掉,它也将被杀掉。

同activity类似的还有,你也可以用Bundle保存fragment状态,万一activity的进程被杀掉了,并且在activity被重新创建时,你需要恢复fragment状态。在回调执行fragment的onSaveInstanceState()期间可以保存状态,在onCreate(),onCreateView(),或者onActvityCreate()中可以恢复状态。更多关于保存状态的信息,参考Activities文档。

在生命周期方面,activity与fragment之间一个很重要的不同,就是在各自的后台栈中是如何存储的。当activity停止时,默认情况下,activity被安置在由系统管理的activity后台栈中(因此用户可以按BACK键回退导航,就像在Tasks和后台栈中讨论的那样)。但是,仅当你在一个事务被移除时,通过显式调用addToBackStack()请求保存的实例,该fragment才被置于由宿主activity管理的后台栈。

除此之外,管理fragment的生命周期与管理activity的生命周期非常相似。所以,管理activity生命周期的实践同样也适用于fragment。你需要了解的,仅仅是activity的生命周期如何影响fragment的的。

fragment所生存的activity生命周期直接影响着fragment的生命周期,由此针对activity的每一个生命周期回调都会引发一个fragment类似的回调。例如,当activity接收到onPause()时,这个activity之中的每个fragment都会接收到onPause()。

Fragment有一些额外的生命周期回调方法,然而,为了处理像是创建和销毁fragment界面,它与activity进行独特的交互。这些额外的回调方法是:

onAttach()
当fragment被绑定到activity时调用(Activity会被传入)。
onCreateView()
创建与fragment相关的视图体系时被调用。
onActivityCreated()
当activity的onCreate()函数返回时被调用。
onDestroyView()
当与fragment关联的视图体系正被移除时被调用。
onDetach()
当fragment正与activity解除关联时被调用。

fragment的生命周期流程实际上是受其宿主activity影响,如图所示。在这张图中,可以看到activity的每个连续状态是如何决定fragment可能接收到哪个回调函数的。例如,当activity接收到它的onCreate()回调时,activity之中的fragment接收到的仅仅是onActivityCreated()回调。

一旦activity处于resumed状态,则可以在activity中自由的添加或者移除fragment。因此,只有当activity处于resumed状态时,fragment的生命周期才可以独立变化。

然而,当activity离开恢复状态时,fragment再一次被activity推入它的生命周期中。

说了那么多,开始看代码,先简单复写各个方法并进行日志打印:

package com.quan.car.fragmenttest;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

/**
 * Created by 权兴权意 on 2016/9/2.
 */
public class WeiXinFragment extends Fragment{

    private Button test_btn_weixinFra;
    private Boolean flag = true;

    private static final String TAG = "权兴权意-WeiXinFragment:";

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_weixin,null);

        //系统第一次画UI时调用,重要
        Log.d(TAG, "onCreateView.");

        test_btn_weixinFra = (Button) view.findViewById(R.id.test_btn_weixinFra);
        test_btn_weixinFra.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (flag){
                    test_btn_weixinFra.setText("TRUE");
                    flag = false;
                }else {
                    test_btn_weixinFra.setText("FLASE");
                    flag = true;
                }
            }
        });
        return view;
    }

    @Override
    public void onAttach(Context context) {
        Log.d(TAG, "onAttach.");
        super.onAttach(context);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        //初始化操作
        Log.d(TAG, "onCreate.");
        super.onCreate(savedInstanceState);
    }

    //onCreateView

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        //初始化onCreateView中加载的view
        Log.d(TAG, "onActivityCreated.");
        super.onActivityCreated(savedInstanceState);
    }

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

    @Override
    public void onResume() {
        //获取焦点
        Log.d(TAG, "onResume.");
        super.onResume();
    }

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

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

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

    @Override
    public void onDestroy() {
        //重要:onDestroy/onDetach,回收内存等操作;
        Log.d(TAG, "onDestroy.");
        super.onDestroy();
    }

    @Override
    public void onDetach() {
        //重要:onDestroy/onDetach,回收内存等操作;
        Log.d(TAG, "onDetach.");
        super.onDetach();
    }
}


然后看一下效果:


刚进入时,输出1;

Home键返回主界面,输出2;

点击应用回来,输出3;

Back键退出,输出4.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值