一、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<Fragment>(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引用资源文件,专门用于定义各种应用资源。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 定义activity_book_list实际引用@layout/activity_book_twopane资源 -->
<item type="layout" name="activity_book_list">
@layout/activity_book_twopane</item>
</resources>
在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()后一定回调此方法