Activity和Fragment

一、Activity生命周期
    运行状态,位于前台,用户可见,可以获得焦点
    暂停状态,位于前台,可见,不能获得焦点
    停止状态,不可见,失去焦点
    销毁状态,该Activity结束或所在进程被结束
系统回调的方法:
    onCreate(Bundle status):创建时调用,只会调用一次
    onStart():启动Activity时调用
    onResume():恢复时调用,当onStart()后一定会调用
    onPause():暂停状态调用
    onRestart():重启调用
    onStop():停止
    onDestroy():销毁Activity调用,只会调用一次
四种加载模式:
    standard:标准模式,每次都会为目标Activity创建新的实例,并添加到当前Task栈中,不会创建新的Task。
    singleTop:Task栈顶单例模式,与standard基本一致,差异在于当目标Activity位于栈顶时,不创建新的Activity。
    singleTask:Task内单例模式,同一个Task内只有一个实例,若没有这创建,若有,则移到栈顶
    singleInstance:全局单例模式,所有Task中创建一个全新的来加载
    
    在Activity配置文件中设置:

    android:exported="true"
    android:launchMode="singleInstance"


二、Fragment
    1.作为Activity的组成部分。通过getActivity()获取所在Activity,反之,通过FragmentManager的findFragmentById()或findFragmentByTag()获取Fragment。
    2.在Activity运行过程中,通过FragmentManager的add(),remove(),replace()动态添加删除。
    3.一个Activity可以组合多个Fragment;反之,一个Fragment也可以被多个Activity复用。
    4.Fragment可以响应自己输入事件,生命周期受所属Activity控制。
    
创建需要实现方法:
    onCreate();初始化想在Fragment中保持的必要组件
    onCreateView():绘制界面组建时回调,必须返回一个View作为Fragment显示的View
    onPause():离开Fragment时回调
    
提交给Activity的每组改变集合被叫做一个事务,并且你能使用FragmentTransaction中APIs来执行它。
每次调用replace方法时Fragment的生命周期会重走。这在现实开发中是不允许的。
解决方案:预先将Fragment加入集合中,切换时从集合取出Fragment添加到FragmentTransaction事务中,每次加入的时候判断是否已经添加到FragmentTransaction中,存在则调用show,并将上一个fragment隐藏。

Activity中:

    //初始化时添加到lis中
    fragmentArrayList = new ArrayList(3);
    fragmentArrayList.add(new Tab1Fragment());
    fragmentArrayList.add(new Tab2Fragment());
    fragmentArrayList.add(new Tab3Fragment());
        
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    //从FragmentTransaction事物获取之前添加的Fragment
    Fragment fragment = getSupportFragmentManager().findFragmentByTag(fragmentArrayList.get(currentIndex).getClass().getName());
    
    //判断此Fragment是否已经添加到FragmentTransaction事物中
    if (!fragment.isAdded()) {
        ft.add(R.id.fragment, fragment, fragment.getClass().getName());
    } else {
        ft.show(fragment);
    }
    ft.commit();

这样做的好处是,每个Fragment切换只进行一次初始化。

根据屏幕大小加载Fragment格式(平板/电话)
在\res\values-large下建立refs.xml引用资源文件,专门用于定义各种应用资源。



    
    
        @layout/activity_book_twopane

在Activity初始化时,

// 指定加载R.layout.activity_book_list对应的界面布局文件
// 但实际上该应用会根据屏幕分辨率加载不同的界面布局文件
setContentView(R.layout.activity_book_list);

Fragment生命周期如Activity,回调函数:
onAttach():当Fragment被添加到Activity时被回调,只会被调用一次。
onCreate(Bundle status):创建Fragment调用,只调用一次
onCreateView():创建、绘制Fragment的view回调,Fragment将显示其View
onActivityCreated():当Fragment所在的Activity被启动完成后回调
onStart():启动
onResume():恢复
onPause():暂停
onStop():停止
onDestroyView():销毁Fragment所包含的View组件调用
onDestroy():销毁Fragment回调,只调用一次
onDetach():将该Fragment从Activity中删除、替换完成时回调,在onDestroy()后一定回调此方法
 

你可能感兴趣的:(Android)