Android的Fragment的生命周期各状态和回调函数使用

回调函数

就像activities一样,fragments也有它们自己的生命周期。理解fragments的生命周期,可以使你在它们被销毁的时候保存它们的实例,这样在它们重新被创建的时候,就能恢复它们之前的状态。

流程:
onAttach()
作用:fragment已经关联到activity,

这个是 回调函数

  @Override
  public void onAttach(Activity activity) {
      super.onAttach(activity);
      Log.i("onAttach_Fragment");
  }

这个时候 activity已经传进来了, 获得activity的传递的值 就可以进行 与activity的通信里, 当然也可以使用getActivity(),前提是这个fragment已经和宿主的activity关联,并且没有脱离,他只调用一次。
onCreate()
系统创建fragment的时候回调他,在他里面实例化一些变量
这些个变量主要是:当你 暂停 停止的时候 你想保持的数据
如果我们要为fragment启动一个后台线程,可以考虑将代码放于此处。
参数是:Bundle savedInstance, 用于保存 Fragment 参数, Fragement 也可以 重写 onSaveInstanceState(BundleoutState) 方法, 保存Fragement状态;
可以用于 文件保护
他只调用一次。

onCreateView()

第一次使用的时候 fragment会在这上面画一个layout出来, 为了可以画控件 要返回一个 布局的view,也可以返回null。

当系统用到fragment的时候 fragment就要返回他的view,越快越好 ,所以尽量在这里不要做耗时操作,比如从数据库加载大量数据显示listview,
    当然线程还是可以的。

给当前的fragment绘制ui布局,可以使用线程更新UI,说白了就是加载fragment的布局的。
    这里一般都先判断是否为null。

if(text==null){
      Bundle args=getArguments();
      text=args.getString("text");
    }
    if (view == null) {
      view = inflater.inflate(R.layout.hello, null);
    }

这样进行各判断省得每次都要加载,减少资源消耗

onActivityCreated()

当Activity中的onCreate方法执行完后调用。

注意了:
    从这句官方的话可以看出:当执行onActivityCreated()的时候 activity的
    onCreate才刚完成。
    所以在onActivityCreated()调用之前 activity的onCreate可能还没有完成,
    所以不能再onCreateView()中进行 与activity有交互的UI操作,UI交互操作可以在onActivityCreated()里面进行。
    所以呢:这个方法主要是初始化那些你需要你的父Activity或者Fragment的UI已经被完
    整初始化才能初始化的元素。
    如果在onCreateView里面初始化空间 会慢很多,比如listview等。
onStart()

和activity一致,启动Fragement 启动时回调,,此时Fragement可见。
onResume()

和activity一致  在activity中运行是可见的。激活, Fragement 进入前台, 可获取焦点时激活。
onPause()

和activity一致  其他的activity获得焦点,这个仍然可见
    第一次调用的时候,指的是 用户 离开这个fragment(并不是被销毁)
    通常用于 用户的提交(可能用户离开后不会回来了)
onStop()

和activity一致, fragment不可见的, 可能情况:activity被stopped了OR fragment被移除但被,加入到回退栈中,一个stopped的fragment仍然是活着的如果长时间不用也会被移除。
onDestroyView()

Fragment中的布局被移除时调用。
    表示fragemnt销毁相关联的UI布局, 清除所有跟视图相关的资源。

以前以为这里没什么用处其实 大有文章可做,
    相信大家都用过ViewPager+Fragment,由于ViewPager的缓存机制,每次都会加载3
    页。
    例如:有四个 fragment 当滑动到第四页的时候 第一页执行onDestroyView(),但没有
    执行onDestroy。他依然和activity关联。当在滑动到第一页的时候又执行了
    onCreateView()。 生命周期可以自己试一下。
    那么问题来了。会出现重复加载view的局面,所以这么做(下面是先人的代码)

@Override
  public void onDestroyView() {
    Log.i("onDestroyView_Fragment");
    if(view!=null){
            ((ViewGroup)view.getParent()).removeView(view);
    }
    super.onDestroyView();
  }

onDestroy()

销毁fragment对象, 跟activity类似了。
onDetach()

Fragment和Activity解除关联的时候调用。 脱离activity。
可见fragment的销毁还是很优雅地,一个一个的来。

下面贴一下 activity和fragment同时运行时候的 生命周期

开始启动:

05-07 05:55:08.553: I/Log(1990): oncreate
05-07 05:55:08.553: I/Log(1990): onAttach_Fragment
05-07 05:55:08.553: I/Log(1990): onCreate_Fragment
05-07 05:55:08.553: I/Log(1990): onCreateView_Fragment
05-07 05:55:08.553: I/Log(1990): onActivityCreated_Fragment
05-07 05:55:08.553: I/Log(1990): onStart
05-07 05:55:08.553: I/Log(1990): onStart_Fragment
05-07 05:55:08.553: I/Log(1990): onResume
05-07 05:55:08.553: I/Log(1990): onResume_Fragment

按下home按键

05-07 05:55:28.725: I/Log(1990): onPause_Fragment
05-07 05:55:28.725: I/Log(1990): onPause
05-07 05:55:29.221: I/Log(1990): onStop_Fragment
05-07 05:55:29.221: I/Log(1990): onStop

再回到界面

05-07 05:55:49.441: I/Log(1990): onRestart
05-07 05:55:49.441: I/Log(1990): onStart
05-07 05:55:49.441: I/Log(1990): onStart_Fragment
05-07 05:55:49.441: I/Log(1990): onResume
05-07 05:55:49.441: I/Log(1990): onResume_Fragment

销毁activity

05-07 05:59:02.293: I/Log(1990): onPause_Fragment
05-07 05:59:02.293: I/Log(1990): onPause
05-07 05:59:02.757: I/Log(1990): onStop_Fragment
05-07 05:59:02.757: I/Log(1990): onStop
05-07 05:59:02.757: I/Log(1990): onDestroyView_Fragment
05-07 05:59:02.757: I/Log(1990): onDestroy_Fragment
05-07 05:59:02.757: I/Log(1990): onDetach_Fragment
05-07 05:59:02.757: I/Log(1990): onDestroy

可以看出 当现实fragment的时候都先执行activity方法,当销毁的时候都是现执行 fragment的方法,这样更好理解fragment是嵌套在activity中

下面一个综合性的例子测试了fragments的不同状态:
1.创建一个Fragment的子类:Fragment1.java。

package net.horsttnann.Fragments; 

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; 

public class Fragment1 extends Fragment {
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) { 

    Log.d("Fragment 1", "onCreateView"); 

    // ---Inflate the layout for this fragment---
    return inflater.inflate(R.layout.fragment1, container, false);
  } 

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

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

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

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

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

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

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

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

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

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

2.按Ctrl+F11,将模拟器转换成“横屏模式”。
3.按F11调试。
4.当应用被加载的时候,LogCat窗口中有如下显示。

03-27 12:23:32.255: D/Fragment 1(704): onAttach
03-27 12:23:32.255: D/Fragment 1(704): onCreate
03-27 12:23:32.255: D/Fragment 1(704): onCreateView
03-27 12:23:32.274: D/Fragment 1(704): onActivityCreated
03-27 12:23:32.274: D/Fragment 1(704): onStart
03-27 12:23:32.286: D/Fragment 1(704): onResume

5.按Home键,LogCat窗口中有如下显示。

03-27 12:25:23.174: D/Fragment 1(704): onPause
03-27 12:25:25.174: D/Fragment 1(704): onStop

6.按Home键不放,重新进入应用,LogCat窗口中有如下显示。

03-27 12:26:21.505: D/Fragment 1(704): onStart
03-27 12:26:21.505: D/Fragment 1(704): onResume

7.按返回键,LogCat窗口中有如下显示。

03-27 12:27:54.384: D/Fragment 1(704): onPause
03-27 12:27:55.324: D/Fragment 1(704): onStop
03-27 12:27:55.324: D/Fragment 1(704): onDestroyView
03-27 12:27:55.324: D/Fragment 1(704): onDestroy
03-27 12:27:55.324: D/Fragment 1(704): onDetach 

解析:
1.当一个fragment被创建的时候,它会经历以下状态.。
onAttach()
onCreate()
onCreateView()
onActivityCreated()
2.当这个fragment对用户可见的时候,它会经历以下状态。
onStart()
onResume()
3.当这个fragment进入“后台模式”的时候,它会经历以下状态。
onPause()
onStop()
4.当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。
onPause()
onStop()
onDestroyView()
onDetach()
5.就像activitie一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。
onCreate()
onCreateView()
onActivityCreated()
6.fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。
onAttached() —— 当fragment和activity关联之后,调用这个方法。
onCreateView() —— 创建fragment中的视图的时候,调用这个方法。
onActivityCreated() —— 当activity的onCreate()方法被返回之后,调用这个方法。
onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
onDetach() —— 当fragment和activity分离的时候,调用这个方法。

(0)

相关推荐

  • Android Fragment 基本了解(图文介绍)

    Fragment Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块. 可以把Fragment设计成可以在多个Activity中复用的模块. 当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善用户体验. 如图:  Fragment的生命

  • Android中fragment嵌套fragment问题解决方法

    都说fragment好用,duang~~,又遇到问题了,记录一下,分享给遇到这个问题的同学! 1.fragment嵌套fragment时出现getActivity()为null activity A嵌套fragment B,B嵌套fragment C,C跳转到activity D,当activity D被finish掉之后,C中容易爆出getActivity为空.如果你的activity被回收了,那你需要在bundle中保存一下fragment信息,我的解决方法:fragment实例化之后会到a

  • Android 管理Activity中的fragments

    FragmentManager 为了管理Activity中的fragments,需要使用FragmentManager. 为了得到它,需要调用Activity中的getFragmentManager()方法. 因为FragmentManager的API是在Android 3.0,也即API level 11开始引入的,所以对于之前的版本,需要使用support library中的FragmentActivity,并且使用getSupportFragmentManager()方法. 用Fragme

  • Android程序开发之Fragment实现底部导航栏实例代码

    流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 说明 IDE:AS,Android studio; 模拟器:genymotion; 实现的效果,见下图. 具体实现 为了讲明白这个实现过程,我们贴出来的代码多一写,这样更方便理解 [最后还会放出完整的代码实现] .看上图的界面做的比较粗糙,但实现过程的骨架都具有了,想要更完美的设计,之后自行完善吧 ^0^. 布局 通过观察上述效果图,发现任意一个选项页面都有三部分组成: 顶部去除ActionBar后的标题栏: 中间一个Fragment

  • android开发教程之实现滑动关闭fragment示例

    主要代码:(有注释) 复制代码 代码如下: package com.example.checkboxtest; import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.os.Handler;import android.os.Message;import andr

  • Android中你可能不知道的Fragment妙用

    本文主要给大家介绍了关于Android中你可能不知道的Fragment妙用的相关内容,分享出来供大家参考学习,下面来一起看看吧. 先来看看效果图 在软件开发中登陆功能是十分常见重要的,就以此为例说明fragment的一种用法,让开发变得更自如 1.这个用法的原因和意义 在未登录情况下,点击很多地方都可能要跳到登陆界面,登陆成功后,当前页面需要刷新 我们的一般做法是StartActivityForResult,在登陆成功后,SetResultOK,finsh登陆页面. 在当前Activity或者f

  • Android基础之Fragment与Activity交互详解

    今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看看Fragment跟Activity的关系. 1.为Activity创建事件回调方法在一些情况下, 你可能需要一个fragment与activity分享事件. 一个好的方法是在fragment中定义一个回调的interface, 并要求宿主activity实现它.当activity通过interfa

  • Android基础之使用Fragment控制切换多个页面

    今天讲解一下Fragment的控制,主要是切换View和页面替换等操作.还有就是如何获取Fragment的管理对象,以及与Activity的通信方式.1.管理Fragment要在activity中管理fragment,需要使用FragmentManager. 通过调用activity的getFragmentManager()取得它的实例. •可以通过FragmentManager做一些事情, 包括: 使用findFragmentById()(用于在activity layout中提供一个UI的f

  • Android的Fragment的生命周期各状态和回调函数使用

    回调函数 就像activities一样,fragments也有它们自己的生命周期.理解fragments的生命周期,可以使你在它们被销毁的时候保存它们的实例,这样在它们重新被创建的时候,就能恢复它们之前的状态. 流程: onAttach() 作用:fragment已经关联到activity, 这个是 回调函数 @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.i("onAttach_

  • Android中Fragment的生命周期与返回栈的管理

    既然我们已经知道了Fragment很好用,那么我们也需要知道它的工作原理.Fragment只能存在于(作为容器的)Activity中,每一个Fragment都有自己的视图结构,可以像我们之前那样载入布局.Fragment的生命周期更加复杂,因为它有更多的状态,如图: 我们来看一下Fragment完整的生命周期. 在Fragment生命周期开始,onInflate方法被调用.要注意的是,这个方法只在我们直接用标签在布局文件中定义的时候才会被调用.我们可以在这个方法中保存一些在xml布局文件中定义的

  • 实例探究Android应用编写时Fragment的生命周期问题

    管理fragment的生命周期有些像管理activity的生命周期.Fragment可以生存在三种状态: Resumed: Fragment在一个运行中的activity中并且可见. Paused: 另一个activity处于最顶层,但是fragment所在的activity并没有被完全覆盖(顶层的activity是半透明的或不占据整个屏幕). Stoped: Fragment不可见.可能是它所在的activity处于stoped状态或是fragment被删除并添加到后退栈中了.此状态的frag

  • Android中Activity的生命周期探讨

    1.完整生命周期 上图是Android Activity的生命周期图,其中Resumed.Paused.Stopped状态是静态的,这三个状态下的Activity存在时间较长. (1)Resumed:在此状态时,用户可以与Activity进行交互,Activity在最前端 (2)Paused:在此状态时,Activity被另外一个Activity遮盖,此Activity不可接受用户输入信息.另外一个Activity来到最前面,半透明的,但并不会覆盖整个屏幕. (3)Stopped:在此状态时,A

  • Android Service类与生命周期详细介绍

    Android  Service类与生命周期 Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面. 1.Service的类图和生命周期 先来看看Service的类图: 接下来看看Service的生命周期: 2.开发Service (1)开发Service需要两步: 第1步:定义子类,继承Service 第2步:在AndroidManifest.xml文件中配置Service (2)创建Service pub

  • Android  Service类与生命周期详细介绍

    Android  Service类与生命周期 Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面. 1.Service的类图和生命周期 先来看看Service的类图: 接下来看看Service的生命周期: 2.开发Service (1)开发Service需要两步: 第1步:定义子类,继承Service 第2步:在AndroidManifest.xml文件中配置Service (2)创建Service pub

  • Android开发Activity的生命周期详解

    目录 前言 典型情况下的生命周期分析 前言 Android生命周期分为两部分: (1)典型情况下的生命周期. (2)异常情况下的生命周期. 典型情况下的生命周期分析 图1 Activity的生命周期图解 图2 Activity生命周期的金字塔图 (1)典型情况下的生命周期指在有用户参与的情况下,Activity所经过的生命周期的改变,正常情况下,Activity的常用生命周期有以下几种情况: onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创

  • Java线程的生命周期和状态控制_动力节点Java学院整理

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现Javalang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它称

  • 深入理解Vue父子组件生命周期执行顺序及钩子函数

    先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行一些叫做生命周期钩子的函数(回调函数),这给了用户在不同阶段添加自己代码的机会. 1.vue的生命周期图 在vue实例的整个生命周期的各个阶段,会提供不同的钩子函数以供我们进行不同的操作.先列出vue官网上对各个钩子函数的详细解析. 生命周期钩子 生命周期钩子 详细 beforeCreate 在实例

  • Android Fragment的生命周期详解

    Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 详解Android Fragment之二:Fragment的创建和生命周期 创建片元(Creating a Fragment) To create a fragment, you must create a subclass of Fragment (or an existing subclass of it). The Fragment class has

随机推荐