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分离的时候,调用这个方法。

时间: 2024-07-30 17:35:55

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

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

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

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

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

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

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

Android开发入门(三)碎片简介 3.2 Fragment的生命周期

就像activities一样,fragments也有它们自己的生命周期.理解fragments的生命周期,可以使你在它们 被销毁的时候保存它们的实例,这样在它们重新被创建的时候,就能恢复它们之前的状态.下面的例子测试 了fragments的不同状态. 1. 创建一个Fragment的子类:Fragment1.java. public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflat

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

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

Android中Activity的生命周期探讨_Android

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中Activity的生命周期探讨

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

Android Fragment的生命周期详解_Android

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).