android activity与fragment 的区别

当面试官突然问就闻到这个问题当时我就有点懵,平常都没怎么注意这个问题,这么一问出来就卡了
心里倒是觉得Fragment与Activity的区别我知道啊,编码的时候用的很多,感觉对这两个Android的主要控件也是很了解的,但是当时回答就糟透了,说了生命周期,其他巴拉巴拉的说了一通,fragment 生命周期少说了几个
现在就来复盘,扒一下。

1、从最基础的开始说--->生命周期

 Activity有7个生命周期:onCreate()---> onStart()--->onResume() --->onPause() --->onStop() --->onDestroy() --->onRestart();

 Fragment有11个生命周期:onAttach() --->onCreate() --->onCreateView() --->onActivityCreate() --->onStart() --->onResume() --->onPause() --->onStop() --->onDestroyView() --->onDestroy() --->onDetach();

 所以Fragment比较与Activity来说会更加灵活,因为生命周期多了,你可以控制的地方也就多了。

  其中
onAttach() 
作用:fragment已经关联到activity,这个时候 activity已经传进来了, 获得activity的传递的值 就可以进行 与activity的通信里, 当然也可以使用getActivity(),前提是这个fragment已经和宿主的activity关联,并且没有脱离,有且只有调用一次。
onCreate()
系统创建fragment的时候回调他,在他里面实例化一些变量,这些个变量主要是:当你暂停、停止的时候 你想保持的数据、他只调用一次。
onCreateView()
第一次使用的时候 fragment会在这上面画一个layout出来, 为了可以画控件 要返回一个 布局的view,也可以返回null j 就什么都没有显示。 
当系统用到fragment的时候 fragment就要返回他的view,越快越好 ,所以尽量在这里不要做耗时操作,比如从数据库加载大量数据 
onActivityCreated()
当Activity中的onCreate方法执行完后调用。当执行onActivityCreated()的时候 activity的onCreate才刚完成。所以在onActivityCreated()调用之前activity的onCreate可能还没有完成,所以不能再onCreateView()中进行与activity有交互的UI操作,UI交互操作可以在onActivityCreated()里面进行。所以呢,这个方法主要是初始化那些你需要你的父Activity或者Fragment的UI已经被完整初始化才能初始化的元素。
onStart()
和activity一致,启动Fragement 启动时回调,,此时Fragement可见。
onResume()
和activity一致 在activity中运行是可见的。激活, Fragement 进入前台, 可获取焦点时激活。
onPause()
和activity一致 其他的activity获得焦点,这个仍然可见第一次调用的时候,指的是 用户 离开这个fragment(并不是被销毁)
通常用于 用户的提交(可能用户离开后不会回来了)
onStop()
和activity一致, fragment不可见的, 可能情况:activity被stopped了或者 fragment被移除但被,加入到回退栈中,一个stopped的fragment仍然是活着的如果长时间不用也会被移除。
onDestroyView() 
Fragment中的布局被移除时调用。表示fragemnt销毁相关联的UI布局, 清除所有跟视图相关的资源。然后这个知识移除视图  并没有销毁而且还没有脱离activity
onDestroy()
销毁fragment对象, 跟activity类似了。
onDetach()
Fragment和Activity解除关联的时候调用。 脱离activity。

2、从灵活性上来说,fragment显得更加灵活。可以直接在XML文件中添加<fragment/>,Activity则不能。

<fragment
Android:id="@+id/test_fragment1"
Android:name="com.example.fragmenttest.TestFragment1"/>

<fragment
Android:id="@+id/test_fragment2"
Android:name="com.example.fragmenttest.TestFragment2"/>

3.可以在一个界面上灵活的替换一部分页面,Activity不可以,做不到,activity 只能进行跳转切换。

4.fragment和Activity之间的通信:(也就是控件的相互操控)

fragment控制fragment:得到一个Activity,然后通过这个Activity的getFragmentManager()获得该Fragment的实例。

fragment控制Activity:这个很简单。每个Fragment都有getActivity()得到一个活动。MainActivity activity=getActivity();

Activity控制fragment:xxxFragment xxx=getFragmentManager().findFragmentById();

Activity控制Activity:这个显然是通过Intent活动之间的通信完成。

5.fragment和Activity中控件的加载

Fragment的载入是通过OnCreateView的时候通过inflater.inflate()加载布局
Activity的载入是通过OnCreate的时候通过setContentView()加载布局

6.动态加载不同的fragment

FragmentManager fragmentManager = getSupportFragmentManager();
List<Fragment> fragments new ArrayList<>();
xxxFragment  fragment = new xxxFragment ();
fragments.add(fragment );
hideOthersFragment(fragment , true);

…………………………
    @Override
    public void onItemClick(int position) {
        switch (position) {
            case 0:
               hideOthersFragment(fragment, false);
                break;
            case 1:
                if (xxxFragment2 == null) {
                       xxxFragment2 fragment2  = new xxxFragment2();
                       fragments.add(fragment2);
                        hideOthersFragment(fragment2, true);
                   } else {
                       hideOthersFragment(fragment2, false);
                   }
                break;
            case 2:
                if (xxxFragment3 == null) {
                       xxxFragment3 fragment3  = new xxxFragment3();
                       fragments.add(fragment3);
                        hideOthersFragment(fragment3, true);
                   } else {
                       hideOthersFragment(fragment3, false);
                   }
                break;
            

        }
    }

/**
     * 动态显示Fragment
     *
     * @param showFragment 要增加的fragment
     * @param add          true:增加fragment;false:切换fragment
     */
    private void hideOthersFragment(Fragment showFragment, boolean add) {
        transition = fragmentManager.beginTransaction();
        if (add)
            transition.add(R.id.main_container_content, showFragment);
        for (Fragment fragment : fragments) {
            if (showFragment.equals(fragment)) {
                transition.show(fragment);
            } else {
                transition.hide(fragment);
            }
        }
        transition.commit();
    }

 

  • 10
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值