Fragment的生命周期相关面试回答,什么妖魔鬼怪

1.你在工作中,fragment与activity通信是怎么做的?

答:

定义一个接口

为了使fragment与其绑定的activity建立通信通道,你可以在fragment中声明一个接口,然后让activity实现它。这个fragment对象可以在生命周期方法onAttach中获得这个接口的实现,然后就可以调用这个接口的方法与其关联的activity进行通信了。

下面是fragment与activity通信的例子:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;
    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
​

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }
​


    ...
}

现在fragment就可以通过执行OnHeadlineSelectedListener接口的具体实现对象mCallback的onArticleSelected方法(或者接口中的其它方法)给activity传送消息了。

举个例子,下面这个方法会在用户点击列表条目的时候被执行,然后fragment会使用回调接口将事件传送给它所附属的activity。

实现接口

为了可以从fragment中接收事件回调,那么含有fragment的activity必须实现在fragment中定义的接口。

举个例子,下面是上面例子中的在activity中的接口实现:

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

​

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

发送消息给fragment

宿主activity可以通过findFragmentById()方法获得fragment的对象,然后再发送消息到fragment中。可以直接执行fragment的public方法发送消息。

举个例子,想象上面例子中的activity可能还含有其它的fragment,这些fragment可能被用来展示上面回调方法返回的数据。在这个例子中,activity会将从回调方法中接收到的信息传递给其它的fragment,其它的fragment会将这些信息显示出来:

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
        ArticleFragment articleFrag = (ArticleFragment)
                getSupportFragmentManager().findFragmentById(R.id.article_fragment);
        if (articleFrag != null) {
            // If article frag is available, we're in two-pane layout...
            // Call a method in the ArticleFragment to update its content
            articleFrag.updateArticleView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...
            // Create fragment and give it an argument for the selected article
            ArticleFragment newFragment = new ArticleFragment();
            Bundle args = new Bundle();
            args.putInt(ArticleFragment.ARG_POSITION, position);
            newFragment.setArguments(args);
​


            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);
            // Commit the transaction
            transaction.commit();
        }
    }
}

2.请你说说Fragment生命周期函数的意义?

答:

setUserVisibleHint():配置Fragment可见或者不可见。
​
getUserVisibleHint():获得Fragment的状态是可见、不可见的,如果可见则进行懒加载操作。
​

onAttach():调用此方法时,Fragment与Activity已经完成绑定,该方法有一个Activity类型的参数,代表绑定的Activity,这时候你可以执行诸如mActivity = activity的操作。
​
onCreate():初始化Fragment。可通过参数savedInstanceState获取之前保存的值。
​
onCreateView():初始化Fragment的布局。加载布局、findViewById的操作通常在此函数内完成。
​

onActivityCreated():调用该方法时,与Fragment绑定的Activity的onCreate方法已经调用完成并返回,在该方法内可以进行与Activity交互的UI操作,所以在此方法之前Activity的onCreate方法并未调用完成,如果提前进行交互操作,会引发空指针异常。
​
onStart():执行该方法时,Fragment由不可见转为可见状态。
​
onResume():执行该方法时,Fragment处于活动状态,用户可与之交互。
​
onPause():执行该方法时,Fragment处于暂停状态,但依然可见,用户不能与之交互。
​
onSaveInstanceState():保存当前Fragment的状态。该方法会自动存储Fragment的状态,比如EditText输入的文本,即使Fragment被回收又重建,一样能恢复EditText之前输入的文本。
​


onStop():执行此方法时,Fragment完全不可见。
​
onDestroyView():销毁与Fragment有关的视图,但未与Activity解除绑定,依然可以使用onCreateView方法重建视图。通常在ViewPager+Fragment的方式下会调用此方法。
​
onDestroy():销毁Fragment。通常按Back键执行退出或者Fragment被回收时调用此方法。
​
onDetach():解除与Activity的关联。在onDestroy方法之后执行。
​
Fragment生命周期执行流程(注意红色的不是生命周期方法):
​
Fragment创建:setUserVisibleHint()->onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume();
​
Fragment变为不可见状态(锁屏、回到桌面、被Activity完全覆盖):onPause()->onSaveInstanceState()->onStop();
​
Fragment变为部分可见状态(打开Dialog样式的Activity):onPause()->onSaveInstanceState();
​
Fragment由不可见变为活动状态:onStart()->OnResume();
​
Fragment由部分可见变为活动状态:onResume();
退出应用:onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()(注意退出不会调用onSaveInstanceState方法;
​
Fragment被回收又重建:被回收执行onPause()->onSaveInstanceState()->onStop()->onDestroyView()->onDestroy()->onDetach(),重新创建执行onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->setUserVisibleHint();
横竖屏切换:与Fragment被回收又重新创建一样。

3.请你说下Fragment的生命周期在你开发中如何使用的,并说说你的理解?

答:

1.Fragment必须放置在一个Activity中,Fragment有自己的生命周期,并且受到了宿主Activity生命周期的影响。 2.创建Fragment的时候系统会执行一个onCreate()的回调函数, 当用户离开此Fragment的时候执行此函数,用来存储持久化数据。 3.onCreateView()函数是Fragment第一次绘制UI的时候调用,这个函数必须重写才能展示给用户,这个函数调用布局来转化成View对象返回! 4.当Fragment与Activity关联的时候执行Attach()函数 之后执行onCreate()->onStart()->onResume(); 当Fragment与Activity失去关联的时候执行onDetach()函数 当Fragment销毁时,之后调用onPause()->onStop()->onDestroy()。

流程过程如下:

image.png

今日分享到此结束,对你有帮助的话,点个赞再走呗,下期更精彩~

关注公众号:Android老皮
解锁  《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) ?

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYvbGUjA' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片