- 生命周期的跳转
- 应用调试
- fragment
- RecyclerView
- ConstrainLayout
- 双版面主从用户界面
- MVVM MVP
一、生命周期的跳转
https://www.jianshu.com/p/d7070d4827ba
https://www.jianshu.com/p/fb44584daee3
activity 跳转的顺序是先pause当前,启动新界面再把之前的stop掉;
这样设计的目的是pause已经能释放大量资源,为了保证界面切换的流畅度
onnewIntent启动时机是启动singleTop模式下的activity,或者给intent中添加一个flag后,或者activity在栈顶再启动它;
被启动activity在栈顶的启动顺序是pause-onnewintent-onresume
被启动activity在栈中的启动顺序是onnewIntent-onrestart-onstart-onresume
三、fragment
fragment生命周期是activity管理的,操作系统不关心,所以fragment生命周期方法都是公共方法,activity要调用他们
1、生命周期如下:
onAttach--onCreate--onCreateView--onActivityCreated--onStart--onResume
--onPause--onStop--onDestoryView--onDestroy--onDetach
其中onAttach,onCreate,onCreagteView全部在setContentView方法中调用
2、fragment的使用
除了在xml中硬性添加fragment,
唯一灵活的方法就是使用代码添加,就是通过activity中的fragmentManager添管理fragment,它会调用所管理的fragment的生命周期方法。
首先为fragment添加一个视图容器,该容器可以用于托管其他的fragment,容器id标识需要添加的fragment,在fragmentManager管理的fragment队列中,不同的fragment就是被容器id标识并保存起来的,此外,在设备旋转或回收内存时,fragmentManager能够保存当前队列,并在activity重建时恢复。
3、设计思路
- 如果有比较多的细小组件需要复用,比较好的方法就是使用自定义view
- 一个屏幕最多使用2-3个fragment
4、fragment之间的通信
有几种方法: - 通过fragment获取activity实例,然后通过findFragmentbyId方法获取其他fragment实例进行通信
- 通过fragmentintent-->Activity-->fragmentintent
对端fragment通过getActivity获取托管activity的信息,缺陷就是拓展性差,fragment必须知道托管activity的实现细节。 - fragment argument
通过创建fragment之后,添加给activity之前,给fragment添加参数为Bundle的argument,然后在fragment的生命周期方法中获取argument
//在activity中调用fragment的生成方法,并添加bundle
public static CrimeFragment newInstance(UUID crimeId) {
Bundle args = new Bundle();
args.putSerializable(ARG_CRIME_ID, crimeId);
CrimeFragment fragment = new CrimeFragment();
fragment.setArguments(args);
return fragment;
}
//在fragment的生命周期方法中获取bundle
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
mPhotoFile = CrimeLab.get(getActivity()).getPhotoFile(mCrime);
}
这样做的好处在于fragment可以作为一个独立的组件使用,无需知道activity的实现细节。而activity知道fragment的细节是合理的。
另一个好处就是fragment的argument能够在fragment因为设备旋转或者内存回收时候保存数据,如果使用其他方式比如实例变量保存数据,就容易丢失。虽然fragment中也有OnSavedInstanceState(Bundle)方法,但是一般argument更方便。
参考:
https://www.jianshu.com/p/7ae890863307
四、RecyclerView
参考:
https://www.jianshu.com/p/0ca3944a8acd
五、ConstrainLayout
是伴随AS2.2推出的一个新布局,最大的特点就是十分适合用可视化的方式编辑,它是用约束的方式排版组件,能够有效的解决布局嵌套过多的问题。
一个控件上下左右方向各有一个约束点,通过往约束点添加约束,控件的位置就能确定
约束能相对于父控件添加,也可以相对于其他控件进行添加
此外在Inspector中横纵的两条轴能改变既定约束下的控件位置
any size是用于填充满当前控件的约束规则,对比于用于填充满当前控件的父布局的match parent
guideLines能够作为水平/垂直对齐的标尺。
通过上述的属性,constrainLayout能够较为轻松的实现比较复杂的UI,相对于RelativeLayout更加强大。
六、双版面主从用户界面
https://www.jianshu.com/p/3ec5d7848e31
七、MVVM、MVP、MVC
MVVM:View--(dataBinding)--ViewModel--Model
- View只负责监听数据变化并更新UI,不应有任何数据逻辑操作;
- ViewModel负责业务逻辑处理并和View层传递数据变化信息,他们之间通过dataBinding双向通信,ViewModel没有持有view的耦合;
- Model定义实体类,以及获取业务数据模型,比如通过数据库或者网络来操作数据等。
有那么几个优势:
1、轻耦合,view和viewmodel之间没有耦合,viewmodel不会持有view的引用
2、异步线程更新UI,UI更新不再需要切换到主线程,dataBinding会自动完成
3、数据驱动,UI 的展现是依赖于数据的,数据的变化会自然的引发 UI 的变化,而 UI 的改变也会使数据 Model 进行对应的更新。
有这三大优势带来的额外福利就是协作和单元测试方便
开发中最明显的改变就是dataBinding让程序员不用再写findViewById()、setText()、setOnClickListener() 这类没有营养的胶水代码。
参考:
https://www.jianshu.com/p/153ba1adf4cc
MVP模式:
传统的MVC模式中Activity承载了太多View好Controller的功能,耦合太大。
MVP中将activity解放,利用View--Presenter--Model的架构,让业务逻辑集中到Presenter中处理,View层集中处理视图逻辑,View和Presenter层相互引用,这样activity就能只负责生命周期的处理。
带来的优势:
- 分离了视图逻辑和业务逻辑,降低了耦合
- Activity只处理生命周期的任务,代码变得更加简洁
- 视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性
- Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试
网友评论