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()。

流程过程如下:

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

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

关注大众号: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零根底入门到精通,高手进阶之路

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