Android Fragment 生命周期

Fragment的概念

  1. Fragments必须放在一个Activity中
  2. Fragments可以接收它自己的事件

  3. 一个Fragment可以放在多个Activity中,一个Activity中也可以放置多个Fragments
  4. Fragments有它自己的生命周期,而且受到它所在的宿主Activity的生命周期的影响

Fragment的生命周期:

onAttach()                

        当Fragment与Activity建立关联的时候调用,Activity作为参数传入。

onCreate()               

        创建Fragment的时候系统会调用此函数。

onCreateView()       

        创建Fragment的UI.

        这个方法必须返回一个View。

        表示这个Fragment的根布局。

onActivityCreated()        

        当Activity的onCreate()方法返回时调用。

onStart()                 

        当Fragment第一次绘制它的UI的时候调用。

onResume()

        当Fragment可见且可交互时调用。
onPause()           

        当用户离开当前Fragment时调用这个方法。
        通常用来保存持久化数据。             

onStop()

        当Fragment不可见时调用。可能情况:activity被stopped或fragment被移除,加入到回退栈。一个stopped的fragment任然是活着的,如果长时间不用也会被移除。

onDestroyView()                

        当Fragment的UI被删除的时候调用。

onDestory()

        当Fragment销毁时调用

onDetach()                        

        当Fragment与Activity取消关联的时候调用。

一个Fragment可以处于3种状态:

  1. 运行状态        
    1. Fragment在当前运行的Activity中可见。
  2. 暂停状态        
    1. 另一个Activity在前台,具有焦点,但是Fragment所在的Activity依然可见。
  3. 停止状态
    1. Fragment不可见。宿主Activity处于停止状态或者Fragment已经从Activity删除并添加到后台栈中。

        Fragment的宿主Activity的生命周期直接影响Fragment的生命周期。因此,Activity的每个生命周期回调函数都会调用对应的Fragment的回调函数。例如,当宿主Activity的onPause()方法被调用的时候,Fragment的onPause()方法也会被调用。

Activity 与  Fragment 生命周期对比:

Fragment 懒加载:

        自定义一个 LazyLoadFragment 基类,利用 setUserVisibleHint 和 生命周期方法,通过对 Fragment状态判断,进行数据加载,并将数据加载的接口提供开放出去,供子类使用。然后在子类 Fragment 中实现 requestData 方法即可。这里添加了一个 isDataLoaded 变量,目的是避免重复加载数据。考虑到 有时候需要刷新数据的问题,便提供了一个用于强制刷新的参数判断。
public abstract class LazyLoadFragment extends BaseFragment
{protected boolean isViewInitiated;
protected boolean isDataLoaded;
@Override
public void onCreate(Bundle savedInstanceState)
{super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{super.onActivityCreated(savedInstanceState);
isViewInitiated = true;
prepareRequestData();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{super.setUserVisibleHint(isVisibleToUser);
prepareRequestData();
}
public abstract void requestData();
public boolean prepareRequestData() {
return
prepareRequestData(false);
}
public boolean prepareRequestData(boolean forceUpdate) {
if (getUserVisibleHint() && isViewInitiated && (!isDataLoaded ||
forceUpdate)) {
requestData();
isDataLoaded = true;
return true;
}
return false;
}
}


 

Fragment状态保存:

Fragment 状态保存入口 :
  1. 1Activity的状态保存, ActivityonSaveInstanceState(), 调用了FragmentMangersaveAllState()方法, 其中会对mActive中各个Fragment的实例状态和View状态分别进行保存.
  2. FragmentManager还提供了public方法: saveFragmentInstanceState(), 可以对单Fragment进行状态保存, 这是提供给我们用的。
  3. FragmentManagermoveToState()方法中, 当状态回退到ACTIVITY_CREATED, 会调用saveFragmentViewState()方法, 保存View的状态

Fragment 在 ViewPager 里面的生命周期,滑动 ViewPager 的页面时 Fragment 的生命周期的变化。 Fragment生命周期:

  1. 当fragment被创建的时候,它会经历以下状态:
    1. onAttach()
    2. onCreate()
    3. onCreateView()
    4. onActivityCreated()
  2. fragment对用户可见的时候,它会经历以下状态:
    1. onStart()
    2. onResume()
  1. fragment不可见的时候,它会经历以下状态:
    1. ​​onPause()
    2. onStop()
  2. fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态:
    1. onPause()
    2. onStop()
    3. onDestroyView()
    4. onDetach()

————————————————

版权声明:本文为CSDN博主 CongPong 的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/CongPong/article/details/125891899
 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值