Activity作为四大组件之首,代表App的页面,是App与用户交互的一个大容器,因此,对Activity进行适当的封装,是很有必要的。但是,Activity内容非常多,要封装哪些内容比较合适呢?在此,根据开发经验总结一下。
封装Activity一般要先定义一个基类:BaseActivity类,考虑到兼容性,一般是继承AppCompatActivity这个类。在使用时,只要定义一个类继承这个BaseActivity就可以了。
想了解封装Activity更多详情,欢迎加本人微信:1914532832。
1.状态栏
开发者都知道,一个页面最顶上的状态栏,这个状态栏可以根据App的设计风格,预先封装到Activity里。封装时,要注意尽量满足设计师的各种可能的需求。封装状态栏一般下面三种情况需要满足:
1.配色状态栏:就是背景颜色和文字图标颜色合理搭配的状态栏,比如深色背景配浅色文字图标、或者浅色背景配深色文字图标的,这样搭配是为了让用户能看清状态栏上的内容。
2.沉浸式状态栏:就是状态栏背景色是透明或半透明的。一般设计页面顶部有一个大图片时,需要设置这种效果。
3.没有状态栏:有些页面需要全屏显示,就需要把状态栏去掉,以腾出空间给其他内容。
这种封装最大的问题是:屏幕适配。android系统的碎片化,导致不同版本Andriod系统和不同品牌手机,有的设置有效果,有的却没有效果。比如设置沉浸式效果的状态栏,Android5.0之后系统才支持沉浸式状态栏,而目前主流手机一般是Android 4.3以上系统,因此还有一部分手机不能显示这种效果。又比如,修改状态栏文字颜色部分手机不会生效。为了满足这种需求,一般做法是设置几套不同布局,根据不同的系统或手机设置不同的布局,但是这样做,明显不是我们开发者愿意的。因此,要将这种情况封装到Activity里,达到自动适配的目的。
2. 导航栏
一般App都会设置统一风格的导航栏,因此导航栏也可以封装到Activity中,导航栏可以设置专门的布局,然后通过include标签插入到Activity对应的布局里,然后在Activity中通过引用导航栏布局里资源id来设置导航栏内容,比如可以在Activity中设置一些方法,来设置页面的标题内容和颜色、导航栏的高度和颜色、是否有分割线、是否需要导航栏等。
3. 加载Fragment
自从Fragment推出后,很多页面的架构都不再单纯使用Activity,就算最简单的页面,也要用一个Activity加一个Fragment来实现。这样做,为程序的扩展性提供了极大的方便。因此,BaseActivity一般也要封装一些Fragment相关的内容,主要包括:加载Fragment,与Fragment的通信(数据互相传递、导航栏内容和事件的修改等)
4. 转场动画
Activity之间跳转时的动画一般称为转场动画,这种动画在一个风格比较稳定的App里,一般也就1到2套。比如从Activity1开启Activity2,那么转场动画可能是这样:Activity1向左逐渐退出屏幕,同时Activity2从右侧逐渐进入屏幕。而关闭Activity2重新回到Activity1页面的转场动画刚好是相反的:Activity2向右逐渐退出屏幕,同时Activity1从左侧逐渐进入屏幕。这种动画也可以预先封装到Activity里,用时只需做一个简单的选择。
5. 弹出框
Toast和Dialog这类弹出框,也可以预先封装到Activity中。特别是Dialog需要预先绑定到Activity的生命周期,以免发生App崩溃。
6. 异步消息
一个Activity页面开启,往往要开启监听很多数据的消息,并将这些消息及时更新到界面上以便让用户得知,这时就要用到类似EventBus、RxBus这样的通信库,但是这种监听一般都需要绑定到Activity的生命周期,以避免Activity关闭后,造成资源泄露或App异常崩溃。一般在BaseActivity的onCreate方法里注册监听器,而在onDestroy方法里释放这些监听器,这样在继承BaseActivity的类里,就只需要直接开启监听器就可以了。
7. 架构初始化
如果用到MVP或者MVVM这些架构模式时,也可以将相关内容预先封住到Activity中。例如:DataBinding,Dagger对象的初始化等,为了使代码更通用,在此使用泛型是一个不错的选择。
有些人把布局也封装到Activity中,个人觉得这种方式不太好,至少android目前为止,还是把Activity与布局文件分开,把布局也封装到Activity中,就等于把这二者又绑到一起,更换布局就要修改Activity中的代码,这明显是不合理的。
如果你有更多可以封装到Activity的内容,欢迎留言交流。
想了解封装Activity更多详情,欢迎加本人微信:1914532832。
网友评论