调用 replace() 时片段的生命周期是啥?

Posted

技术标签:

【中文标题】调用 replace() 时片段的生命周期是啥?【英文标题】:What is the lifecycle of a fragment when replace() is called?调用 replace() 时片段的生命周期是什么? 【发布时间】:2014-10-01 22:12:24 【问题描述】:

我有一些使用以下代码动态添加的片段:

private class DrawerItemClickListener implements ListView.OnItemClickListener 
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
        selectItem(position);
    


private void selectItem(int position) 
    // update the main content by replacing fragments
    Fragment fragment = null;
    if(position == 0)
        fragment = new FirstFragment();
    
    else if(position == 1)
        fragment = new SecondFragment();
    
    else if(position == 2)
        fragment = new ThirdFragment();
    

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

    // update selected item and title, then close the drawer
    mDrawerList.setItemChecked(position, true);
    setTitle(mCalculatorTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);

在我的一个片段中,我有一个计时器,我刚刚发现当片段被替换时,旧片段中的计时器仍在运行。我应该在片段生命周期的哪个位置终止计时器?

编辑:

好的,所以我在片段的 onStop() 方法中添加了 timer.cancel(),但是当我从操作栏上的按钮加载首选项时,也会调用 onStop()。这不是预期的效果。还有其他想法吗?

【问题讨论】:

签出 - androidlearnersite.wordpress.com/2017/02/27/… ..它解释了片段交易期间的片段生命周期与最新的 appcompat 版本 【参考方案1】:

我会杀死 onStop() 中的任何计时器或异步工作

http://developer.android.com/guide/components/fragments.html#Lifecycle

引用 API 文档:

已停止 片段不可见。主机活动已停止或片段已从活动中删除但已添加 到后栈。停止的片段仍然存在(所有状态和 会员信息由系统保留)。然而,它不是 对用户可见的时间更长,如果活动被终止,将被杀死 被杀了。

片段生命周期:

【讨论】:

好吧,这似乎与正在发生的事情相关,但是当片段在同一个活动中被替换时,是否有任何东西被调用? 替换片段时应该调用所有这些。证明这一点的一种方法是覆盖每个生命周期方法并Log 它们。然后您可以观看各种回调。希望对您有所帮助。 抱歉,我没有问对问题。是否只有在替换片段时才会调用任何内容?我还在顶部加载首选项活动,我真的不希望计时器在此期间停止。但是 onStop() 会被调用。 没有特定于replace(),没有。但是您可以使用您的片段实现的方法onReplace() 创建自己的名为Replaceable 的接口,并在调用FragmentTransaction.replace() 时直接调用它。【参考方案2】:

定时器任务与片段生命周期无关。 当您使用该片段完成工作时,您可以取消计时器。 Fragment 的 onStop 方法是这样做的好地方。

public void onStop() 
    super.onStop();
    timer.cancel();

【讨论】:

这是我的第一个想法,但并不完全正确,当我在顶部添加新活动时也会调用 onStop(),请参阅我的编辑。

以上是关于调用 replace() 时片段的生命周期是啥?的主要内容,如果未能解决你的问题,请参考以下文章

理解片段事务期间片段的生命周期方法调用

在不存在的片段上调用片段生命周期和 onCreate 的问题

Android 片段生命周期

Android片段生命周期:onResume调用了两次

导航架构片段重载问题

活动和片段之间的生命周期