jjzjj

Android Fragment 生命周期

Cong Pong 2023-05-30 原文

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
 

有关Android Fragment 生命周期的更多相关文章

  1. ruby - 在 Ruby 中查找周期和范围集差异的有效方法 - 2

    我在Ruby中有很多时间范围:period=Time.parse('8:00am')..Time.parse('8:00pm')incidents=[Time.parse('7:00am')..Time.parse('9:00am'),Time.parse('1:00pm')..Time.parse('3:00pm'),Time.parse('1:30pm')..Time.parse('3:30pm'),Time.parse('7:00pm')..Time.parse('9:00pm'),]我正试图在这段时间内获得一系列无事件block。对于以上内容:[Time.parse('9:00

  2. ruby-on-rails - 有没有一种简单的方法可以在 Passenger 的请求周期之外运行垃圾收集? - 2

    unicorn有OobGC可用于在一定数量的请求后运行GC.start的机架中间件。PhusionPassenger中有类似的东西吗? 最佳答案 PhusionPassenger4正式引入了带外垃圾回收机制。它比Unicorn更灵活,允许任意工作,而不仅仅是垃圾收集。http://blog.phusion.nl/2013/01/22/phusion-passenger-4-technology-preview-out-of-band-work/ 关于ruby-on-rails-有没有一种

  3. ruby-on-rails - rails 周期性任务 - 2

    我有一个ruby​​onrails应用程序,我试图在其中找到每隔几秒运行一些代码的方法。我发现了很多使用cron或类似cron的实现的信息和想法,但这些只是准确到分钟,并且/或需要外部工具。我想每15秒左右启动一次任务,并且我希望它完全独立于应用程序中(如果应用程序停止,任务也停止,并且没有外部设置)。这用于缓存数据的后台生成。每隔几秒,任务就会收集一些数据,然后将其存储在缓存中,供所有客户端请求使用。该任务非常慢,因此需要在后台运行并且不阻塞客户端请求。我是ruby​​的新手,但有很强的perl背景,我解决这个问题的方法是创建一个间隔计时器和处理程序,它fork、运行代码,然后在完成

  4. ruby-on-rails - Rails 应用程序的生命周期 - 2

    我正在尝试了解Rails应用程序的生命周期。application_controller.rb什么时候运行?是每次更改时只执行一次,还是每次请求时都执行一次?我想了解以下文件:config/environments/*.rb(开发、生产或测试,取决于当前模式)boot.rb环境.rb路线.rb我问这个的原因之一是,我想知道放在哪里比较好初始化代码自定义配置数据编辑:@Gdeglin的回答很好,但我实际上很想知道这些文件中的每一个何时运行。 最佳答案 应用程序Controller.rbApplicationController是所有C

  5. ruby - 在 Sinatra(Ruby) 中,我应该如何创建在应用程序生命周期中只赋值一次的全局变量? - 2

    在Sinatra中,我无法创建在应用程序生命周期中仅分配一次值的全局变量。我错过了什么吗?我的简化代码如下所示:require'rubygems'ifRUBY_VERSION这导致nil2在终端和,2在浏览器中。如果我尝试将@a=1放入initialize方法中,我会在WebApp.run!中遇到错误线。我觉得我错过了一些东西,因为如果我不能有全局变量,那么我如何在应用程序实例化期间加载大数据?beforedo似乎每次有来自客户端的请求时都会被调用。 最佳答案 classWebApp请注意,如果您使用Shotgun或其他在每次请求时

  6. javascript - 使用 ajax 调用 react 组件 - 生命周期 - 2

    所以我有一个使用React和Ajax调用的有趣案例。在上下文中,我有一个带有3个选项卡的Accordion。初始化Accordionreact组件后,我首先打开第一个选项卡,其余选项卡关闭。每个选项卡的主体中都有所谓的DictionaryCall组件,如下所示:returnclassDictionaryCallextendsReact.Component{constructor(props){super();this.state={word:'',data:[],error:false,nodata:false,initialLoaded:props.load}}componentDi

  7. javascript - 为什么 setInterval() 周期每次都变快? - 2

    我正在Javascript上构建自定义slider,我希望每次用户单击slider的div时,slider都应停止X秒。我的代码是:$(document).ready(function(){varciclo;varindex_slide=1;functionstartSlidercicle(){ciclo=setInterval(function(){//Slidercodegoeshere},3000);}//HereIstarttheslideranimationstartSlidercicle();//Whentheuserclicksonadivcalled'slide',st

  8. javascript - 如何从 Vue.js 中的组件生命周期方法访问 mixin 方法内部的函数 - 2

    这是一个例子:混入.jsexportdefault{methods:{aFunction(){//Somefunctionalityhere}}}组件.vueimportmixinfrom'./mixin'exportdefault{mixins:[mixin]created(){//CallaFunctiondefinedinthemixinhere}}我想从组件内部的created()生命周期方法访问在mixin方法内部定义的aFunction。 最佳答案 mixin方法与组件的当前实例合并,所以它只是:created(){th

  9. javascript - 如何知道脚本 block 或 JavaScript 代码的生命周期? - 2

    我想知道javascriptblock/函数是否在加载后始终可用。因为我已经测试了一些东西,现在我有点困惑。我将一个脚本block定义到一个div中。脚本block有一个事件处理函数,用于元素使用ajax重新加载div。ajax调用返回div的纯html并将其替换为当前的html。但这意味着替换执行的脚本。我认为脚本会在替换语句后停止执行。但它没有。执行替换语句后的代码行那么这些东西是如何工作的。您如何描述脚本block的生命周期? 最佳答案 当代码包含在script中时元素被求值时,代码求值的结果成为页面运行时环境的一部分。删除s

  10. javascript - Google Chrome 标签页 ID 在标签页的生命周期内发生变化 - 2

    我正在实现处理选项卡的GoogleChrome扩展程序。这包括我获取onCreated、onUpdated和onActivated。每次,我都在我的逻辑中使用tabId,它最初在处理onCreated事件期间存储在一个数组中。原则上,一切正常。但是,我注意到了一个小故障。有时,现有选项卡的ID会更改。因此,一个选项卡有一个不在我的数组中的ID,这自然会导致错误。我可以在以下用例中重现此问题:使用不同的URL打开2个或更多标签在一个选项卡中加载一个已在另一个选项卡中加载的URL在这种情况下,会发生两件事:首先,触发T的onActivated事件,而不是onUpdated事件。其次,T现在

随机推荐