Android面试-第五期

203 阅读4分钟

Intent 如何传递大文件

这道题想考察什么

考察的是 intent传递数据的容量限制

细分下来的知识点

  1. 说明不能传输大数据的原因
  2. 如果业务要求必须传递大数据,如何解决

如何作答

  1. 在Activity或者组件之前传递信息时,一般采用intent绑定bundle的方式传值,但在使用过程中需要注意的是不要用bundle传递大容量数据。由于传递的数据量过大导致程序ANR,甚至直接报异常。这是由于bundle不能传递大容量的数据信息,Inetent、Bundle等传递数据时有一个缓冲区,而这个缓冲区最大只有1MB. 所以当数据量大时会出现android.os.TransactionTooLargeException。

  2. 但是通常也有两种解决方式。

    方法一:将需要传递的数据写在临时文件或者数据库中,再跳转到另外一个组件的时候再去读取这些数据信息,这种处理方式会由于读写文件较为耗时导致程序运行效率较低;

    方法二:将需要传递的数据信息封装在一个静态的类中(注意当前组件和要跳转到的组件必须属于同一个进程,因为进程之间才能够共享数据),在当前组件中为类设置内容,然后再跳转到的组件中去取,这种处理方式效率很高,但是会破坏程序的独立性。

    具体采用哪种替代方式取决于具体的情况,一般建议采取第二种处理方式,因为这样会大大提高程序的运行效率.


Fragment 跟 Activity 之间是如何传值的

这道题想考察什么

考察常规开发中的多页面数据传递问题

细分下来的知识点

  1. Activity和Fragment的关系
  2. 如何优雅传值

如何作答

  1. Fragment是作为Activity的子界面而存在的。当 Fragment 跟 Activity 绑 定 之 后 , 在 Fragment 中 可 以 直 接 通 过getActivity()方法获取到其绑定的 Activity 对象,这样就可以调用 Activity的方法了。

  2. 在 Activity 中可以通过如下方法获取到 Fragment 实例:

    FragmentManager fragmentManager = getFragmentManager();

    Fragment fragment = fragmentManager.findFragmentByTag(tag);

    Fragment fragment = fragmentManager.findFragmentById(id);

    获取到 Fragment 之后就可以调用 Fragment 的方法。也就实现了通信功能。

总之两者可以获取到对方的引用,就能拿到对方的属性.


描述一下 Fragment 的生命周期

这道题想考察什么

考察Android基础,但是如果只是说说浅显的基础,那还不够

细分下来的知识点

  1. 官网上关于生命周期的流程
  2. 官网图上体现不出的特性

如何作答

理解Fragment的生命周期不要仅限于官网的图,必须要结合自身的使用经验来讲。

image-20201022234428129.png

fragment被创建的时候,经历包含onAttach、onCreate、onCreateView、onActivityCreated方法;fragment对用户可见的时候,经历包含onStart、onResume方法;fragment进入“后台模式”的时候,经历onPause、onStop方法;fragment被销毁了(或者持有它的activity被销毁了),经历包含onPause、onStop、onDestroyView、onDestroy、onDetach方法;并且可用onCreate、onCreateView、onActivityCreated方法Bundle对象保存一个fragment的对象。

  • onAttach:当Fragment与Activity发生关联时调用

  • onCreate:创建Fragment时被回调,经历暂停或停止状态继而恢复后,想保留Fragment的基本组件,则在此进行初始化。

  • onCreateView:首次绘制页面时候调用,在此可以创建View,也可以返回null,这样不建议耗时操作。

  • onActivityCreated:Fragment绑定Activity,在onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,不能在此之前跟Activity进行交互。

  • onStart:启动 Fragment 时被回调,此时Fragment可见,只是还没有在前台显示,因此无法与用户进行交互

  • onResume:Fragment在前台可见,处于活动状态,用户可与之交互

  • onPause:Fragment处于暂停状态,但依然可见,用户不能与之交互

  • onStop:停止Fragment回调,Fragment完全不可见

  • onDestoryView:销毁与Fragment有关的视图,但未与Activity解除绑定

  • onDestory:销毁 Fragment 时被回调,通常按Back键退出或者Fragment被回收时调用此方法,此后接onDetach

  • onDetach:与onAttach相对应,当Fragment与Activity关联被取消时调用

  • setUserVisibleHint:调用次方法可以设置Fragment可见或者不可见。可以调用getUserVisibleHint()获得Fragment的可见或不可见状态,如果可见则进行懒加载操作