Android 基类BaseActivity的封装
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 基类BaseActivity的封装相关的知识,希望对你有一定的参考价值。
参考技术A 摘要本篇总结了前人写的BaseActivity,自己在开发过程中也添添补补,删删改改,现在总结下。
本篇很多知识借鉴和学习了知乎上iYng大大的回答,先感谢一波。顺便上原文链接:
https://www.zhihu.com/question/47045239/answer/105086885
正文
一般来说,不同的项目的BaseActivity不尽相同,根据不同的业务逻辑和功能需求,会有很多区别。这里总结了一些,如下:
视图相关
一般的Activity里都会用到很多的findViewById这个方法,而且每次都要强制类型转换,这样会显得很繁琐,如果在BaseActivity里封装好,就能省事:
这样只要是继承了BaseActivity就能轻松使用LinearLayout llContent = findView(R.id.ll_content);,免去了诸多类型转换的麻烦。
然后说起视图,一般的Activity里都会需要初始化视图和数据,所以可以暴露两个方法initView()和initData():
然后在setContentView里去调用,一般都是先initView,然后再initData:
这样子类里都必须重写initView()和initData()了,逻辑也能清晰点,不然什么东西都放在onCreate里,就很乱了;
用户模块(业务相关【可选】)
不过一般的app,只要是有登录的,就会有用户模块,也会根据用户标识id去进行一些网络操作,所以用户模块可以在BaseActivity中暴露一些方法,比如用户id的获取:
这里就是返回了SharedPreference里存储的用户id,在用户id大量被使用的场景下,这样的封装还是很有必要的,使用起来也更便捷。当然如果只是纯展示的app就不一定需要了,或许显得多余。
界面间跳转传参
很多时候,Activity之间都会传参,所以可以封装一个参数处理的函数initParam(),在BaseActivity的onCreate里去判断是否有参数传过来;
然后把initParam()方法暴露给子类:
这个方法并不是必须重写的,因为传参也没有想象中那么多,并不需要强制重写这个方法。
一般会在Application类里去定义一个isDebug来判断是否开启调试(开发者模式):
在BaseActivity里,我们可以把isDebug作为总开关,然后控制是否显示调试信息:
这样一键关闭调试,不用去一个个删项目里的Log信息,是不是很赞?
每次Toast,都用Toast.makeText(...).show();是不是很烦?那么可以在BaseActivity里封装下,比如:
这里ToastUtils就是一个Toast封装类,里面的内容估计大家都懂。然后这样一来,所有子类在使用时,只需要潇洒写一句toast("xxxx")就行了,当然也可以一并封装Toast.LENGTH_LONG和Toast.LENGTH_SHORT,按需封装吧。
其他
软键盘
有的app里,用户输入的情景会比较多,这个时候,软键盘的隐藏就用的多了,用户输入完之后,或者用户点击屏幕空白处,都应该去隐藏软键盘,这样的话,可以考虑在BaseActivity里写隐藏的方法:
上面3个方法也是很实用的。dispatchTouchEvent方法不需要手动调用,只要是有点击事件,并且点击在软键盘和EditText区域外,就会隐藏软键盘。
防止快速点击
有时候,用户(特别是测试猿)会疯狂的点击app,这一举动的原因和意义不明,但是我们可以设置防止快速点击给app造成的伤害和负担:
这样在1秒之内只会响应一次,麻麻再也不用担心我手抽筋乱点了。
那么怎么用呢?举个栗子,可以在onClick接口里去判断下嘛:
页面跳转:startActivity、startActivityForResult
这个也是可选的,可以封装下,达到每次跳转不需要传this或者XXXXX.this这种参数:
这些方法还是很便捷的,使用时可以简单的使用startActivity(MainActivity.class);,也可以传Bundle参数。
是否允许全屏
设置一个成员变量mAllowFullScreen
通过在BaseActivity的onCreate方法里判断mAllowFullScreen来设置是否允许全屏:
然后给子类暴露一个方法来设置mAllowFullScreen:
设置沉浸式状态栏
跟设置全屏一样一样的:
然后BaseActivity的onCreate里:
然后定义steepStatusBar()方法,用来设置沉浸式状态栏:
这里就要判断系统版本了。只有在KITKAT以上才有作用。
最后给子类暴露方法,设置 isSetStatusBar的值:
设置是否允许屏幕旋转
跟前面两种思路一样,通过判断变量,在onCreate里设置咯:
BaseActivity里的onCreate方法:
最后暴露方法设置isAllowScreenRoate的值:
总结
上面的这些方法大都是比较常用的,有些虽然不是很常用,但是写了也会方便一点,把这篇文章当做一个汇总,然后按需使用呗。
在对Activity基类的封装中,我做了什么
在开发实践中,不同Activity有很多代码是反复冗余的。因此非常有必要将这部分抽取出来。封装一个继承自Activity的类,命名为BaseActivity。
翻看之前写过的代码,起初,BaseActivity只用来做了一个友盟统计,每一个Activity的onPause与onResume方法进行了重写,基于此记录了页面使用的相关数据。代码例如以下:
public class BaseActivity extends Activity { protected String Tag; protected Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Tag = this.getClass().getSimpleName(); mContext = this; } @Override protected void onResume() { super.onResume(); MobclickAgent.onResume(this); } @Override protected void onPause() { super.onPause(); MobclickAgent.onPause(this); } }接下来发现,除了这个,还有非常多工作能够放在BaseActivity中来做,节省大量的人力物力。
当中,Toast是很很常见的一个简单提示控件。在学习后,最初是这样使用的:
//须要进行显示一个Toast Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();后来发现每次写太麻烦。不如将其封装为一个工具类其中。其中借鉴各位大神的封装模式:
public class T { private T() { /* cannot be instantiated */ throw new UnsupportedOperationException("cannot be instantiated"); } public static boolean isShow = true; public static void showShort(Context context, CharSequence message) { if (isShow) Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } public static void showShort(Context context, int message) { if (isShow) Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } public static void showLong(Context context, CharSequence message) { if (isShow) Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } public static void showLong(Context context, int message) { if (isShow) Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } }每次使用时,能够少些一个參数,显示的时间略。
一段时间过后。将这个显示Toast方法封装在Activity中,是否会更加优雅,于是乎:
public class BaseActivity extends Activity { //...add new method protected void showShortToast(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } }
在继承BaseActivity后,每次显示Toast岂不是非常方便?
举一反一,其它经常使用UI控件相同能够进行封装。
在有的项目中,使用了像UIL第三方的图片载入库。相同能够进行封装,也在一定程度降低了非常多代码量,例如以下图:
public class ImageLoaderBaseActivity extends BaseActivity { protected DisplayImageOptions options; protected ImageLoader imageLoader; protected void onCreate(Bundle savedInstanceState) { options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.bg_pic_loading) .showImageForEmptyUri(R.drawable.ic_launcher) .showImageOnFail(R.drawable.ic_launcher).cacheInMemory(true) .cacheOnDisc(true).considerExifParams(false) .imageScaleType(ImageScaleType.EXACTLY_STRETCHED) .bitmapConfig(Bitmap.Config.RGB_565) .resetViewBeforeLoading(false)// 设置图片在下载前是否重置,复位 .build();// 构建完毕 imageLoader = ImageLoader.getInstance(); imageLoader.init(ImageLoaderConfiguration.createDefault(this)); }; }
事实上,隐藏ActionBar也可放在BaseActivity里面。
除此,还有好多。希望能起到抛砖引玉的作用,大家一起来讨论!
博主新人,还请各位大神轻拍。
以上是关于Android 基类BaseActivity的封装的主要内容,如果未能解决你的问题,请参考以下文章
Android 谈谈封装那些事 --BaseActivity 和 BaseFragment